{
  "openapi": "3.1.0",
  "info": {
    "title": "API abierta",
    "description": "La API abierta de MoreLogin ofrece una interfaz RESTful completa y fácil de usar para desarrolladores que le permite administrar programáticamente perfiles de navegador, teléfonos en la nube y recursos relacionados, lo que posibilita una automatización, escalabilidad y control impecables. La API abierta de MoreLogin se ejecuta en su máquina y es accesible en: https://api.morelogin.com",
    "version": "2026-09-05"
  },
  "tags": [
    {
      "name": "Authorization",
      "description": "API relacionadas con Authorization."
    },
    {
      "name": "Cloud Phone Management",
      "description": "API relacionadas con Cloud Phone Management."
    },
    {
      "name": "Live Streaming",
      "description": "Inicie, consulte y detenga transmisiones en vivo de Cloud Phone."
    },
    {
      "name": "Account & Quotas",
      "description": "Consulte el saldo de la cartera y las cuotas de Cloud Phone."
    },
    {
      "name": "ADB",
      "description": "API relacionadas con ADB."
    },
    {
      "name": "Files",
      "description": "API relacionadas con Files."
    },
    {
      "name": "Apps",
      "description": "API relacionadas con Apps."
    },
    {
      "name": "Schedules",
      "description": "API relacionadas con Schedules."
    },
    {
      "name": "Touch",
      "description": "API relacionadas con Touch."
    },
    {
      "name": "Proxy Management",
      "description": "API relacionadas con Proxy Management."
    },
    {
      "name": "Group Management",
      "description": "API relacionadas con Group Management."
    },
    {
      "name": "Tag Management",
      "description": "API relacionadas con Tag Management."
    },
    {
      "name": "Monthly Billing",
      "description": "Consulta planes mensuales disponibles y activa Cloud Phones mensuales."
    }
  ],
  "x-tagGroups": [
    {
      "name": "",
      "tags": [
        "Authorization",
        "Cloud Phone Management",
        "Live Streaming",
        "Account & Quotas",
        "ADB",
        "Files",
        "Apps",
        "Schedules",
        "Touch",
        "Monthly Billing"
      ]
    }
  ],
  "paths": {
    "/balance": {
      "get": {
        "operationId": "getAccountAndCloudPhoneQuotas",
        "summary": "Obtener saldo y cuotas de Cloud Phone",
        "description": "Devuelve el saldo del monedero del equipo y sus asignaciones de uso de Cloud Phone.\n- **Requisitos previos**: el miembro que llama necesita el permiso de costes. El monedero se consulta por equipo, así que las cifras son de todo el equipo y no por miembro.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Unidades**: `balance` es el saldo del monedero **en céntimos**, no en unidades de moneda. `remainingDuration` son minutos de Cloud Phone y `remainingConcurrency` un número de plazas; ambos se limitan a 0 en lugar de volverse negativos.\n- **Contenido**: exactamente estas tres cifras. Los importes retenidos del monedero, el desglose entre minutos usados y concedidos y las fechas de caducidad existen aguas arriba, pero deliberadamente no se exponen aquí.\n- **Nota**: la llamada falla por completo si falla la consulta del monedero o la de las cuotas; nunca devuelve cifras parciales.",
        "tags": [
          "Account & Quotas"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BalanceResponse"
          }
        }
      }
    },
    "/cloudphone/monthly/skus": {
      "get": {
        "operationId": "listMonthlyCloudPhoneSkus",
        "summary": "Listar planes mensuales de Cloud Phone disponibles",
        "description": "Devuelve los productos mensuales de Cloud Phone disponibles para el equipo.\n\n- **Efecto**: ninguno; no reserva capacidad ni cobra el saldo. Es de solo lectura.\n- **Uso**: pasa el `skuId` devuelto a [`/cloudphone/create`](./open-api.yaml#operation/createUsingPOST). El precio está en centavos de dólar y el período actual es de 30 días.\n- **Resultado vacío**: un array `data` vacío indica que no hay productos mensuales disponibles.\n\nConsulta [Error Codes](../Getting%20Started/error-codes.md) para los errores habituales.",
        "tags": [
          "Monthly Billing"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneSkusResponse"
          }
        }
      }
    },
    "/cloudphone/monthly/activate": {
      "post": {
        "operationId": "activateMonthlyCloudPhones",
        "summary": "Comprar y activar Cloud Phones mensuales",
        "description": "Compra y activa de 1 a 10 Cloud Phones mensuales durante 30 días.\n\n- **Aviso de cobro**: **esta operación descuenta realmente saldo del equipo.**\n- **Permiso**: el miembro debe tener **Gestión de gastos/pagos**; de lo contrario se devuelve `99012`.\n- **Crear primero**: crea los teléfonos con [`/cloudphone/create`](./open-api.yaml#operation/createUsingPOST); la creación solo genera registros inactivos y no cobra.\n- **Selección**: los ID deben ser distintos, pertenecer al equipo y usar productos mensuales activos de 30 días. Se permiten SKU mensuales distintos. Mezclar estados u órdenes incompatibles, pedidos pendientes del cliente o compras concurrentes rechaza toda la solicitud.\n- **Cobro y restauración**: la validación y el cobro son todo o nada. Si todos pertenecen al mismo pedido pagado, se restaura el derecho existente sin volver a cobrar. Local API, Open API y el cliente comparten el estado.\n- **Finalización**: confirma 30 días para todos; no enciende teléfonos ni activa renovación.\n- **Activación no confirmada**: con `33422`, `data.results` sigue completo y ordenado. Revisa `status`, `expireTime` y `errorCode`.\n- **Reintento**: tras un timeout, consulta [`/cloudphone/info`](./open-api.yaml#operation/infoUsingPOST) o [`/cloudphone/page`](./open-api.yaml#operation/pageUsingPOST).\n\nErrores documentados: `20002`, `20003`, `20004`, `20008`, `20041`, `20055`, `20068`, `20070`, `20071`, `33420`, `33421`, `33422`, `99001`, `99002`, `99012`. Consulta [Error Codes](../Getting%20Started/error-codes.md).",
        "tags": [
          "Monthly Billing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonthlyCloudPhoneActivateRequest"
              },
              "example": {
                "ids": [
                  "1724032706822188",
                  "1724032729890861"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneActivateResponse"
          }
        }
      }
    },
    "/cloudphone/live/start": {
      "post": {
        "operationId": "startCloudPhoneLiveStreaming",
        "summary": "Iniciar transmisión en vivo",
        "description": "Inicia la transmisión en directo de un MP4 ya subido en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo, y su servicio debe admitir la transmisión en directo. El `fileId` debe referirse a un archivo subido como contenido de transmisión cuya carga haya finalizado; cualquier otra cosa se rechaza como inválida o caducada.\n- **Finalización**: **aceptado, no completado.** La respuesta solo confirma que el servicio aceptó la petición. Consulta `/cloudphone/live/status` hasta que `liveStatus` sea `1`.\n- **Nota**: la restricción de solo MP4 se aplica al subir el archivo, no aquí.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a emitir el comando de inicio.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`, `33418`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLiveStartRequest"
              },
              "example": {
                "phoneId": "190000000000000001",
                "fileId": "820000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/cloudphone/live/status": {
      "post": {
        "operationId": "getCloudPhoneLiveStreamingStatus",
        "summary": "Obtener estado de transmisión",
        "description": "Informa de si un Cloud Phone está transmitiendo en directo en este momento.\n- **Requisitos previos**: el teléfono debe pertenecer a tu equipo y su servicio debe admitir la transmisión en directo. A diferencia del inicio y la parada, **no** hace falta que esté encendido ni reservado por ti.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Valores**: `liveStatus` es `0` (sin transmisión) o `1` (transmitiendo). **No existe un estado de fallo**: un inicio que nunca surtió efecto simplemente se queda en `0`, así que acota tu sondeo con un timeout.\n\nErrores de negocio documentados: `33300`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveStatusResponse"
          }
        }
      }
    },
    "/cloudphone/live/end": {
      "post": {
        "operationId": "stopCloudPhoneLiveStreaming",
        "summary": "Detener transmisión en vivo",
        "description": "Detiene la transmisión en directo en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo, y su servicio debe admitir la transmisión en directo. **No se comprueba si hay realmente una transmisión en curso**: el comando de parada se envía en cualquier caso.\n- **Finalización**: aceptado, no completado. Consulta `/cloudphone/live/status` hasta que `liveStatus` sea `0`.\n- **Reintentos**: idempotente en su efecto; una llamada repetida simplemente reenvía el comando de parada.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/oauth2/token": {
      "post": {
        "operationId": "oauth2TokenPost",
        "summary": "Token de acceso",
        "deprecated": false,
        "description": "Intercambia un API ID y una API key por un token bearer de OAuth2.\n- **Requisitos previos**: `client_id` es el API ID y `client_secret` la API key. El miembro debe estar activo, y la IP de quien llama debe cumplir las listas de permitidos y denegados de IP de la Open API.\n- **Efecto**: ninguno; el token está autofirmado y no se almacena nada en el servidor.\n- **Vigencia**: `expires_in` segundos, 3600 por defecto. **No hay token de refresco ni endpoint de refresco**; solicita un token nuevo en su lugar.\n- **Concurrencia**: como los tokens no tienen estado, emitir uno nuevo **no** invalida los anteriores: varios pueden ser válidos a la vez. Un token deja de funcionar solo cuando caduca o cuando se rota la API key.\n- **Reintentos**: es seguro reintentar.\n\nErrores de negocio documentados: `12002`, `35002`, `35005`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Authorization"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "client_id": {
                    "description": "Un ID de API identifica a un miembro.",
                    "type": "string"
                  },
                  "client_secret": {
                    "description": "Una clave API autentica un ID de cliente. Para llamar a las API de MoreLogin, deberás\nintercambiar tu ID de API y tu clave API por un token de acceso.\nMantén este secreto a salvo.\n",
                    "type": "string"
                  },
                  "grant_type": {
                    "description": "Nombre del paquete: solo es necesario si no se proporciona appVersionId.",
                    "type": "string",
                    "example": "client_credentials"
                  }
                },
                "required": [
                  "client_id",
                  "client_secret",
                  "grant_type"
                ]
              },
              "example": {
                "client_id": "1661515884160372",
                "client_secret": "string",
                "grant_type": "client_credentials"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un objeto con los campos `scope`, `access_token`, `token_type`, `expires_in` y `client_metadata`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "scope": {
                          "type": "string"
                        },
                        "access_token": {
                          "type": "string"
                        },
                        "token_type": {
                          "type": "string"
                        },
                        "expires_in": {
                          "type": "integer"
                        },
                        "client_metadata": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "name"
                          ],
                          "x-apidog-orders": [
                            "name"
                          ],
                          "x-apidog-ignore-properties": []
                        }
                      },
                      "required": [
                        "scope",
                        "access_token",
                        "token_type",
                        "expires_in",
                        "client_metadata"
                      ],
                      "x-apidog-orders": [
                        "scope",
                        "access_token",
                        "token_type",
                        "expires_in",
                        "client_metadata"
                      ],
                      "x-apidog-ignore-properties": []
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ],
                  "x-apidog-orders": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ],
                  "x-apidog-ignore-properties": []
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "scope": "cloudphone",
                    "access_token": "example-access-token\n",
                    "token_type": "Bearer",
                    "expires_in": 3600,
                    "client_metadata": {
                      "name": "team name"
                    }
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {},
            "x-apidog-name": "成功",
            "x-apidog-ordering": 0
          }
        },
        "security": []
      }
    },
    "/oauth2/userinfo": {
      "get": {
        "operationId": "oauth2UserinfoGet",
        "summary": "Información del usuario",
        "deprecated": false,
        "description": "Devuelve el miembro y el equipo a los que pertenece el token de acceso actual.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Uso**: la forma más económica de comprobar que un token sigue siendo válido y de averiguar el equipo al que está asociado.",
        "tags": [
          "Authorization"
        ],
        "responses": {
          "200": {
            "description": "Correcto. `data` es un objeto con los campos `teamId`, `teamName`, `memberId`, `memberNickName` y `memberEmail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "teamId": {
                          "type": "string"
                        },
                        "teamName": {
                          "type": "string"
                        },
                        "memberId": {
                          "type": "string"
                        },
                        "memberNickName": {
                          "type": "string"
                        },
                        "memberEmail": {
                          "type": "string"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "teamId": "1673823102599682",
                    "teamName": "example-name",
                    "memberId": "1673823102599682",
                    "memberNickName": "example-name",
                    "memberEmail": "string"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadUrl": {
      "post": {
        "summary": "Obtener URL de carga de archivos",
        "deprecated": false,
        "description": "Solicita una URL prefirmada para subir un archivo que recibirá un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Efecto**: no se persiste nada; la URL se genera al momento.\n- **Finalización**: sincrónica. **La URL prefirmada es válida durante una hora.** Envía el contenido del archivo con `PUT` y después registra la subida con el endpoint de registro; registrarla antes de que el objeto exista se rechaza.\n- **Nota**: subir de nuevo el mismo nombre de archivo sobrescribe el objeto anterior. Los objetos temporales se eliminan automáticamente al cabo de 7 días.",
        "operationId": "get",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "fileName": {
                    "type": "string",
                    "description": "Upload file name"
                  }
                },
                "required": [
                  "id",
                  "fileName"
                ]
              },
              "example": {
                "fileName": "live-video.mp4",
                "id": "1661515884160372"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `presignedUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "error message\n"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "presignedUrl": {
                          "type": "string",
                          "description": "File upload URL use https PUT uploading files to cloud storage"
                        }
                      },
                      "required": [
                        "presignedUrl"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "presignedUrl": "https://example.com/resource"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadFile": {
      "post": {
        "summary": "Subir archivos",
        "deprecated": false,
        "description": "Registra un archivo ya subido para que el Cloud Phone lo descargue.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo, y **el objeto ya debe existir en la URL**: el servicio lo inspecciona y rechaza la petición cuando no puede leerlo. Las subidas para transmisión en directo deben ser MP4 y dirigirse a un servicio que admita transmisión.\n- **Finalización**: **aceptado, no completado.** La respuesta devuelve `fileId` con estado en curso. Consulta el endpoint de resultado de la subida hasta que el estado sea correcto o fallido.\n- **Reintentos**: no hay deduplicación; cada llamada crea otro `fileId`.\n- **Nota sobre la superficie**: en la Local API esta ruta es un flujo multipart distinto y más antiguo. El equivalente de este endpoint en la Local API es `/api/cloudphone/upload/file`.\n\nErrores de negocio documentados: `33401`, `33419`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "fileUploadUsing",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string",
                    "example": "1661515884160372"
                  },
                  "url": {
                    "type": "string",
                    "description": "Object URL obtained from `presignedUrl` after the file bytes have been uploaded, or another publicly accessible download URL",
                    "example": "https://storage.example.com/cloudphone/test.jpg"
                  },
                  "uploadDest": {
                    "description": "Upload destination directory",
                    "type": "string",
                    "example": "/Download"
                  },
                  "uploadType": {
                    "type": "integer",
                    "enum": [
                      1,
                      2
                    ],
                    "default": 1,
                    "description": "File type (`1` = regular file, `2` = MP4 live-streaming file)"
                  }
                },
                "required": [
                  "id",
                  "url",
                  "uploadDest"
                ]
              },
              "example": {
                "id": "1661515884160372",
                "url": "https://storage.example.com/cloudphone/live-video.mp4",
                "uploadDest": "/Download",
                "uploadType": 2
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `fileId`, `id` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "fileId": {
                          "type": "string",
                          "description": "Uploaded file ID"
                        },
                        "id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload status 0:uploading 1:success 2:failed"
                        }
                      },
                      "required": [
                        "fileId",
                        "id",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "fileId": "1661515884160111",
                    "id": "1661515884160372",
                    "status": 1
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadFileResult": {
      "post": {
        "summary": "resultado de uploadFile",
        "deprecated": false,
        "description": "Consulta el estado de una subida de archivo a un Cloud Phone.\n- **Requisitos previos**: el teléfono debe pertenecer a tu equipo. Es el endpoint de archivos menos restrictivo: no requiere que el teléfono esté encendido ni reservado por ti.\n- **Valores**: `0` subiendo, `1` correcta, `2` fallida.\n- **Resultado vacío**: cuando no se encuentra el `fileId`, la llamada tiene éxito igualmente pero `data` es null. Interprétalo como «todavía no visible o ya no presente», no como un fallo.\n- **Coste**: la consulta recorre la lista de archivos del servicio, así que no es barata. Sondea a un intervalo moderado en lugar de en un bucle cerrado.",
        "operationId": "fileUploadResult",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string",
                    "example": "1661515884160372"
                  },
                  "fileId": {
                    "type": "string",
                    "description": "Uploaded file ID"
                  }
                },
                "required": [
                  "id",
                  "fileId"
                ]
              },
              "example": {
                "id": "1661515884160372",
                "fileId": "1661515884160372"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `fileId`, `id` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "fileId": {
                          "type": "string",
                          "description": "Uploaded file ID"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload status 0:uploading 1:success 2:failed"
                        }
                      },
                      "required": [
                        "fileId",
                        "id",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1661515884160372",
                    "fileId": "1661515884160111",
                    "status": 1
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/download": {
      "post": {
        "operationId": "cloudphoneDownloadPost",
        "summary": "Descarga de archivos",
        "deprecated": false,
        "description": "Descarga un archivo desde un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Efecto**: el servicio recorre primero el directorio padre y solo después inicia la transferencia, así que una ruta inexistente falla **aquí** y no en la consulta de estado. Debe corresponder a un archivo normal, no a un directorio.\n- **Finalización**: **aceptado, no completado.** La respuesta devuelve `downId`; consulta `/cloudphone/download/result` hasta que el estado sea correcto, fallido o cancelado. Ese endpoint vuelve a comprobar que el teléfono sigue encendido y sigue siendo tuyo.\n- **Reintentos**: no es idempotente: cada llamada vuelve a recorrer el directorio y emite un `downId` nuevo.\n\nErrores de negocio documentados: `33300`, `33301`, `33507`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone id"
                  },
                  "filePath": {
                    "type": "string",
                    "description": "file path: /sdcard/Download/a.txt\n"
                  }
                },
                "required": [
                  "filePath",
                  "id"
                ]
              },
              "example": {
                "filePath": "/sdcard/Download/report.csv",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id` and `downId`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Cloud phone id"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download id "
                        }
                      },
                      "required": [
                        "id",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "id": "1661515884160372",
                    "downId": "1661515884160999"
                  },
                  "requestId": "7dcf166a597842139af5ce12d25fe0f8"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/download/result": {
      "post": {
        "operationId": "cloudphoneDownloadResultPost",
        "summary": "Resultado de la descarga del archivo",
        "deprecated": false,
        "description": "Consulta el estado de una descarga de archivo desde un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Pasa el `downId` devuelto por la petición de descarga.\n- **Valores**: **usan una escala distinta a las subidas**: `10` en curso, `20` correcta, `30` fallida, `40` cancelada. `downUrl` solo se rellena una vez que la descarga ha tenido éxito.\n- **Nota**: el caso «el archivo no existe» lo informa la propia petición de descarga, que primero recorre el directorio padre, no este endpoint.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone id"
                  },
                  "downId": {
                    "type": "string",
                    "description": "file download id"
                  }
                },
                "required": [
                  "downId",
                  "id"
                ]
              },
              "example": {
                "downId": "1661515884160999",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `status`, `downId` and `downUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "integer",
                          "description": "Download file status;10:Running, 20:Successful, 30:Failed, 40:Cancelled"
                        },
                        "downUrl": {
                          "type": "string",
                          "description": "File download URL; use it only when status is 20"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download task ID"
                        }
                      },
                      "required": [
                        "status",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "status": 20,
                    "downId": "1661515884160999",
                    "downUrl": "https://get.morelogin.com/..."
                  },
                  "requestId": "17d9dbfd958e4f40a51897520138d3ff"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/setKeyBox": {
      "post": {
        "operationId": "cloudphoneSetKeyBoxPost",
        "summary": "Juego de caja de llaves",
        "deprecated": false,
        "description": "Instala un certificado keybox en un Cloud Phone.\n- **Requisitos previos**: `filePath` debe apuntar a un archivo `.xml`, y el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Efecto**: entrega la ruta del certificado al servicio del dispositivo. MoreLogin no almacena nada y el servicio no define ningún paso de activación; si el dispositivo necesita reiniciarse para que el certificado surta efecto depende del comportamiento del servicio.\n- **Finalización**: aceptación sincrónica por parte del servicio. No hay ningún endpoint que informe del certificado instalado.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "filePath": {
                    "type": "string",
                    "description": "Ruta del archivo, por ejemplo, /sdcard/Download/xxx.xml"
                  },
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  }
                }
              },
              "example": {
                "filePath": "",
                "id": "0"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/install": {
      "post": {
        "operationId": "cloudphoneAppInstallPost",
        "summary": "Instala la aplicación en tu teléfono en la nube.",
        "deprecated": false,
        "description": "Instala una app de la biblioteca del equipo en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. La app ya debe existir en la biblioteca del equipo o en el catálogo público; identifícala con `appVersionId`, o bien con `packageName` más `versionCode`. Además debe haberse subido al servicio que atiende a este teléfono; de lo contrario la instalación falla.\n- **Límite de frecuencia**: como máximo una instalación por teléfono y por segundo; una segunda llamada más rápida se rechaza.\n- **Finalización**: **aceptado, no completado.** La respuesta solo confirma que la petición se puso en cola. Consulta `/cloudphone/app/installedList` para ver si la app llegó.\n- **Reintentos**: es seguro reintentar tras comprobar la lista de instaladas, respetando el límite de una por segundo.\n\nErrores de negocio documentados: `33005`, `33014`, `33714`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appVersionId": {
                    "description": "ID de la versión de la aplicación",
                    "type": "string"
                  },
                  "id": {
                    "description": "ID de teléfono en la nube",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "Nombre del paquete: solo es necesario si no se proporciona appVersionId.",
                    "type": "string"
                  },
                  "versionCode": {
                    "description": "Código de versión: solo es necesario si no se proporciona el appVersionId.",
                    "type": "integer"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "appVersionId": "1672940217990530",
                "id": "1673823102599682"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/page": {
      "post": {
        "operationId": "cloudphoneAppPagePost",
        "summary": "Obtener la lista de aplicaciones APP",
        "deprecated": false,
        "description": "Lista las apps que se pueden instalar en un Cloud Phone.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado. No interviene ningún Cloud Phone, así que el teléfono no necesita estar en ejecución.\n- **Contenido**: el catálogo público de apps, es decir, las apps disponibles globalmente más las publicadas para tu equipo. Cada entrada lleva sus versiones en `appVersionList`, de más nueva a más antigua; toma `appVersionList[].id` como `appVersionId` para `/cloudphone/app/install`.\n- **Advertencia sobre la paginación**: los resultados se reordenan después de obtener la página, por lo que el orden solo es estable dentro de una página y `total` refleja la página actual en lugar del catálogo completo. Usa `pages` para navegar.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "Nombre de la app (coincidencia parcial)",
                    "type": "string"
                  },
                  "pageNum": {
                    "description": "Número de página; por defecto: 1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Elementos por página; por defecto: 10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "de",
                "pageNum": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene las aplicaciones disponibles para su equipo en la página solicitada; cada aplicación lleva sus versiones en `appVersionList`, la más reciente primero. `data.total` es el número de registros de la página actual, no el total: use `data.pages` para la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "total": {
                          "type": "string",
                          "description": "Número de registros de la página actual"
                        },
                        "current": {
                          "type": "string",
                          "description": "Número de página actual"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Número total de páginas"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "ID de la aplicación. No es el valor que espera `/cloudphone/app/install`."
                              },
                              "appName": {
                                "type": "string",
                                "description": "Nombre de la aplicación"
                              },
                              "appIcon": {
                                "type": "string",
                                "description": "URL del icono de la aplicación"
                              },
                              "packageName": {
                                "type": "string",
                                "description": "Nombre del paquete de Android"
                              },
                              "categoryValue": {
                                "type": "integer",
                                "description": "ID de categoría"
                              },
                              "sortNo": {
                                "type": "integer",
                                "description": "Orden usado por la biblioteca de aplicaciones"
                              },
                              "appVersionList": {
                                "type": "array",
                                "description": "Versiones de esta aplicación, ordenadas por `versionCode` de forma descendente (la más reciente primero)",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "description": "ID de versión de la aplicación. Pase este valor como `appVersionId` a `/cloudphone/app/install`."
                                    },
                                    "versionCode": {
                                      "type": "string",
                                      "description": "Código de versión"
                                    },
                                    "versionName": {
                                      "type": "string",
                                      "description": "Nombre visible de la versión"
                                    },
                                    "installStatus": {
                                      "type": [
                                        "integer",
                                        "null"
                                      ],
                                      "description": "Siempre null en esta operación. Consulte el estado de instalación con `/cloudphone/app/installedList`."
                                    },
                                    "packageName": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "Siempre null en esta operación; use el `packageName` del nivel de aplicación."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1672940217990529",
                        "appName": "Depop",
                        "appIcon": "https://cdn.morelogin.com/app/depop.png",
                        "packageName": "com.depop",
                        "categoryValue": 1,
                        "sortNo": 0,
                        "appVersionList": [
                          {
                            "id": "1672940217990530",
                            "versionCode": "450000000",
                            "versionName": "4.50.0",
                            "installStatus": null,
                            "packageName": null
                          }
                        ]
                      }
                    ]
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/team/app/page": {
      "post": {
        "operationId": "cloudphoneTeamAppPagePost",
        "summary": "Listar aplicaciones del equipo",
        "deprecated": false,
        "description": "Lista la biblioteca de apps propia de tu equipo, incluidas las apps preinstaladas.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Contenido**: una fuente distinta de `/cloudphone/app/page`: estas son las apps que subió tu equipo, devueltas de forma plana (una fila por versión de app) en lugar de anidadas por versión. Las entradas llevan un estado de revisión; mientras una actualización está en curso, los campos de estado describen **la versión que se está actualizando**, no la activa.\n- **Nota**: filtrar por un servicio no reconocido devuelve una página vacía en lugar de un error.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "Nombre de la aplicación (coincidencia parcial)",
                    "type": "string"
                  },
                  "pageNo": {
                    "description": "Página actual; predeterminado 1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Elementos por página; predeterminado 10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "TikTok",
                "pageNo": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene los registros de la página solicitada y es un array vacío cuando no hay coincidencias; `data.total`, `data.current` y `data.pages` describen la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataPageResultCloudPhoneAppDto"
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "15",
                    "current": "1",
                    "pages": "2",
                    "dataList": [
                      {
                        "id": "123456",
                        "appName": "Facebook",
                        "packageName": "com.facebook.katana",
                        "versionName": "450.0.0.1",
                        "versionCode": "450000000",
                        "enabled": true,
                        "desc": "Social media application",
                        "enableRoot": false
                      }
                    ]
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/installedList": {
      "post": {
        "operationId": "cloudphoneAppInstalledListPost",
        "summary": "Consultar la lista de aplicaciones instaladas",
        "deprecated": false,
        "description": "Lista las apps instaladas actualmente en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe pertenecer a tu equipo. A diferencia de la mayoría de los comandos de Cloud Phone, **no** hace falta que lo tengas reservado, pero se consulta al servicio en vivo, así que un teléfono apagado suele fallar en el servicio y no con un error de MoreLogin.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Uso**: es la señal de finalización de `/cloudphone/app/install` y `/cloudphone/app/uninstall`. Los nombres e iconos de las apps se completan desde el catálogo; los paquetes que no están catalogados se devuelven tal cual.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "ID de teléfono en la nube",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1674550360293464"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un array de objetos con los campos `appName`, `appIcon`, `packageName`, `versionCode` y `versionName` y un array vacío cuando no hay nada que devolver.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "appName": {
                            "type": "string"
                          },
                          "appIcon": {
                            "type": "string"
                          },
                          "packageName": {
                            "type": "string"
                          },
                          "versionCode": {
                            "type": "string"
                          },
                          "versionName": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "appName": "example-name",
                      "appIcon": "string",
                      "packageName": "example-name",
                      "versionCode": "string",
                      "versionName": "example-name"
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/start": {
      "post": {
        "operationId": "cloudphoneAppStartPost",
        "summary": "Iniciar la aplicación",
        "deprecated": false,
        "description": "Lanza una app instalada en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Finalización**: la respuesta confirma que el comando llegó al servicio, no que la app esté en primer plano. No hay ningún endpoint que informe de la app en ejecución: verifícalo con una captura de pantalla o un comando de shell.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a enviar el comando.\n\nErrores de negocio documentados: `33300`, `33301`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "ID de teléfono en la nube",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "nombre del paquete de la aplicación",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "packageName"
                ]
              },
              "example": {
                "id": "1674550360293464",
                "packageName": "com.depop"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es siempre null en esta operación; el resultado lo transmite `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/restart": {
      "post": {
        "operationId": "cloudphoneAppRestartPost",
        "summary": "Reiniciar la aplicación",
        "deprecated": false,
        "description": "Reinicia una app en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. **No se comprueba si la app está instalada**: un paquete ausente simplemente no hace nada.\n- **Finalización**: la respuesta confirma que el comando se envió al servicio, no que la app se haya reiniciado. Confírmalo con `/cloudphone/app/installedList` u observando el dispositivo.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "nombre del paquete de la aplicación"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de respuesta, mensaje de error devuelto si el código > 0"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  },
                  "required": [
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/stop": {
      "post": {
        "operationId": "cloudphoneAppStopPost",
        "summary": "Detener la aplicación",
        "deprecated": false,
        "description": "Detiene una app en ejecución en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. No se comprueba si la app está instalada ni si está en ejecución.\n- **Finalización**: la respuesta confirma que el comando se envió al servicio, no que la app se haya detenido.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "nombre del paquete de la aplicación"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si el código > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/uninstall": {
      "post": {
        "operationId": "cloudphoneAppUninstallPost",
        "summary": "Desinstalar la aplicación",
        "deprecated": false,
        "description": "Desinstala una app de un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Efecto**: envía la desinstalación y actualiza el registro de instalación del teléfono.\n- **Finalización**: la respuesta confirma que la petición se aceptó. Verifícalo con `/cloudphone/app/installedList`.\n\nErrores de negocio documentados: `33300`, `33301`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "nombre del paquete de la aplicación"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si el código > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/openRoot": {
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Habilitar ROOT de la aplicación",
        "description": "Concede ROOT a paquetes de apps concretos en un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible con dispositivos compatibles; en otros modelos la llamada tiene éxito pero no surte efecto.\n- **Efecto**: envía la lista de paquetes permitidos al dispositivo y, como efecto secundario, activa el interruptor de ROOT. **MoreLogin no almacena nada**, por lo que la concesión no se puede consultar desde la API.\n- **Finalización**: aceptación sincrónica por parte del servicio. Cuándo surte efecto ROOT en el dispositivo depende del comportamiento del servicio; MoreLogin no reinicia el teléfono.\n- **Nota**: actualmente no hay ningún endpoint para revocar ROOT en paquetes individuales. Usa `/cloudphone/enableRoot` para desactivar el interruptor global.\n\nErrores de negocio documentados: `33300`, `33301`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "cloudphoneAppOpenRootPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiAppRootOperateDto"
              },
              "example": {
                "id": "12345678",
                "packageNames": [
                  "com.test"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = correcto, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/setHideAccessibilityApp": {
      "post": {
        "operationId": "cloudphoneAppSetHideAccessibilityAppPost",
        "summary": "Configurar Ocultar la aplicación de accesibilidad",
        "deprecated": false,
        "description": "Oculta apps de la lista del servicio de accesibilidad de Android en uno o varios Cloud Phones.\n- **Requisitos previos**: de 1 a 100 identificadores de teléfono y de 1 a 100 nombres de paquete. Los teléfonos deben pertenecer a tu equipo, pero **no** hace falta que estén encendidos ni reservados por ti. Cuando ninguno de los identificadores se resuelve, la llamada devuelve un fallo de negocio en lugar de un error.\n- **Efecto**: la lista se envía al servicio y **MoreLogin no la almacena**, por lo que no se puede volver a consultar. Compatible con modelos compatibles; en otros modelos la llamada tiene éxito pero no surte efecto.\n- **Finalización**: sincrónica. En algunos modelos cada paquete se envía en una llamada independiente al servicio, así que una lista larga tarda proporcionalmente más y un fallo a mitad de camino deja aplicados los paquetes anteriores.\n- **Nota**: MoreLogin no aplica ninguna comprobación de versión de Android; la restricción de modelos documentada proviene de la capacidad del servicio, y los nombres de paquete se transmiten literalmente.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Identificadores de teléfono en la nube"
                  },
                  "packageName": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Nombre del paquete de la aplicación. Una cadena vacía equivale a borrar, mientras que * o ALL oculta todas las aplicaciones."
                  }
                }
              },
              "example": {
                "ids": [
                  "0"
                ],
                "packageName": [
                  "*"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor booleano.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si el código > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/page": {
      "post": {
        "summary": "Obtener una lista de perfiles de teléfono en la nube",
        "description": "Lista los Cloud Phones visibles para el equipo autenticado, página a página.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Nota**: se devuelven teléfonos de todos los tipos de dispositivo. Las contraseñas de los proxies de plataforma y dinámicos se eliminan de la respuesta.\n- **Uso**: este endpoint y `/cloudphone/info` son las señales de finalización de las operaciones asíncronas de encendido, nuevo dispositivo en un clic y aprovisionamiento.",
        "operationId": "pageUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bindIp": {
                    "type": "boolean",
                    "description": "Si la IP está vinculada: verdadero = vinculada, falso = no lo está",
                    "example": false
                  },
                  "keyword": {
                    "type": "string",
                    "description": "Palabras clave para filtrar: información del proxy, nombre del grupo, nombre de la etiqueta, nombre del entorno",
                    "example": "CP-424"
                  },
                  "pageNo": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Página actual",
                    "example": 1
                  },
                  "pageSize": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Elementos por página",
                    "example": 100
                  },
                  "sort": {
                    "type": "array",
                    "description": "Campos de ordenación dinámicos. Actualmente, solo se admite \"envName\" para teléfonos en la nube.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sortDirection": {
                          "type": "string",
                          "enum": [
                            "asc",
                            "desc"
                          ],
                          "description": "Dirección de ordenación",
                          "example": "asc"
                        },
                        "sortField": {
                          "type": "string",
                          "description": "Campo para ordenar (actualmente solo se admite \"envName\")",
                          "example": "envName"
                        }
                      },
                      "required": [
                        "sortDirection",
                        "sortField"
                      ]
                    },
                    "example": [
                      {
                        "sortDirection": "asc",
                        "sortField": "envName"
                      }
                    ]
                  }
                },
                "example": {
                  "bindIp": false,
                  "keyword": "CP-424",
                  "pageNo": 1,
                  "pageSize": 100,
                  "sort": [
                    {
                      "sortDirection": "asc",
                      "sortField": "envName"
                    }
                  ]
                }
              },
              "example": {
                "bindIp": false,
                "keyword": "CP-424",
                "pageNo": 1,
                "pageSize": 100,
                "sort": [
                  {
                    "sortDirection": "asc",
                    "sortField": "envName"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto 0: Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "mensaje de error"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "current": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CloudPhoneProfile"
                          }
                        },
                        "pages": {
                          "type": "string"
                        },
                        "total": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "current": "1",
                    "dataList": [
                      {
                        "abnormalStatus": 1,
                        "adbInfo": {
                          "adbIp": "string",
                          "adbPassword": "string",
                          "adbPort": "9222",
                          "remark": "example remark",
                          "success": 1
                        },
                        "billingType": 1,
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": 1,
                        "createMemberName": "example-name",
                        "enableAdb": true,
                        "envName": "example-name",
                        "envRemark": "example remark",
                        "envStatus": 1,
                        "expireTime": "2026-09-01 12:00:00",
                        "groupId": "1673823102599682",
                        "groupName": "example-name",
                        "id": "1673823102599682",
                        "androidId": "1673823102599682",
                        "gaid": "1673823102599682",
                        "lastConnectDate": "2026-09-01 12:00:00",
                        "lastConnectMemberId": "1673823102599682",
                        "lastConnectMemberName": "example-name",
                        "lastStartDate": "2026-09-01 12:00:00",
                        "lastStartMemberId": "1673823102599682",
                        "lastStartMemberName": "example-name",
                        "proxy": {
                          "country": "string",
                          "countryCode": "string",
                          "createDate": "2026-09-01 12:00:00",
                          "delFlag": 1,
                          "expiryTime": "2026-09-01 12:00:00",
                          "exportIp": "9222",
                          "groupId": "1673823102599682",
                          "id": "1673823102599682",
                          "providerCode": "string",
                          "proxyAreaCode": "string",
                          "proxyCatagoryType": 1,
                          "proxyCheckStatus": 1,
                          "proxyInfo": "string",
                          "proxyIp": "string",
                          "proxyName": "example-name",
                          "proxyPort": 1,
                          "proxyRegionCode": "string",
                          "proxyStatus": 1,
                          "proxySub": {
                            "activeRecordId": "1673823102599682",
                            "businessId": "1673823102599682",
                            "createMember": 1,
                            "endTime": "2026-09-01 12:00:00",
                            "id": "1673823102599682",
                            "nextBillingTime": "2026-09-01 12:00:00",
                            "startTime": "2026-09-01 12:00:00",
                            "subPayMethod": "string",
                            "subStatus": 1,
                            "subType": 1,
                            "teamId": "1673823102599682"
                          },
                          "proxyType": 1,
                          "proxyTypeCode": "string",
                          "regionKey": "string",
                          "releaseTime": "2026-09-01 12:00:00",
                          "uniqueId": 1
                        },
                        "proxyStatus": 1,
                        "supportAdb": true,
                        "tagInfos": [
                          {
                            "id": "1673823102599682",
                            "tagName": "example-name"
                          }
                        ],
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": 1
                      }
                    ],
                    "pages": "1",
                    "total": "1"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/link": {
      "post": {
        "summary": "Crear enlace de conexión remota al teléfono en la nube",
        "description": "Crea un enlace temporal de acceso por navegador al teléfono en la nube (solo Open API).\n\n- **Requisitos**: el teléfono debe pertenecer al equipo, ser accesible para el miembro que llama, estar encendido y no estar ocupado por otro miembro. La API no lo enciende automáticamente.\n- **Efecto**: cada llamada crea un enlace nuevo sin solicitar credenciales de conexión ni modificar la conexión actual. Abra `data.url` en un navegador o genere un código QR con la URL completa.\n- **Validez**: exactamente 5 minutos desde la creación. Las visitas repetidas no consumen ni amplían el enlace. Tras caducar, vuelva a llamar a la API. No se devuelve `expiredTime`; este plazo no indica la validez de las credenciales de conexión.\n- **Conexión**: cada visita correcta solicita nuevas credenciales y redirige a la página de control remoto; puede afectar a una conexión anterior. Una visita fallida puede reintentarse durante la validez restante. Crear el enlace no garantiza que la conexión posterior funcione.\n- **Protección**: mantenga confidencial la URL completa. La respuesta incluye `Cache-Control: no-store`. Use la URL devuelta tal cual; el servidor elige el dominio y los parámetros de conexión.\n\nErrores de negocio documentados: `33300`, `33301`, `99002`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "createCloudPhoneRemoteLink",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del teléfono en la nube de MoreLogin."
                  },
                  "lang": {
                    "type": "string",
                    "description": "Idioma de la página, por ejemplo `zh-CN` o `en-US`. Si se omite o está vacío, se usa el idioma de la solicitud; los valores no admitidos usan el predeterminado configurado. El idioma se incluye en la URL; puede cambiar el parámetro de consulta `lang` para cambiar el idioma de la página."
                  }
                }
              },
              "example": {
                "id": "1710784536928649",
                "lang": "en-US"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.url` es el enlace temporal de acceso por navegador, válido durante 5 minutos.",
            "headers": {
              "Cache-Control": {
                "description": "No almacene esta respuesta en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "type": "object",
                      "required": [
                        "url"
                      ],
                      "properties": {
                        "url": {
                          "type": "string",
                          "format": "uri",
                          "description": "URL temporal de acceso por navegador. Trate la URL completa como una credencial sensible.",
                          "example": "https://gateway.example.com/app/cloudphone/qrcodeUrl?token=0123456789abcdef0123456789abcdef&lang=en-US"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "url": "https://gateway.example.com/app/cloudphone/qrcodeUrl?token=0123456789abcdef0123456789abcdef&lang=en-US"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "source": "curl --request POST 'https://api.morelogin.com/cloudphone/link' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"id\":\"1710784536928649\",\"lang\":\"en-US\"}'"
          }
        ]
      }
    },
    "/cloudphone/create": {
      "post": {
        "summary": "Creación de un teléfono en la nube",
        "description": "Compra y aprovisiona uno o varios Cloud Phones.\n- **Requisitos previos**: el plan debe tener capacidad restante y la cuota diaria de creación no puede estar agotada. `country`, `timezone` y `language` se validan contra la lista que admite el servicio elegido, por lo que una combinación no admitida se rechaza en lugar de ajustarse en silencio. Las coordenadas se limitan a ±180 de longitud y ±90 de latitud. El número de teléfono se descarta cuando el SKU elegido no admite uno. Los SKU mensuales se pueden crear mediante la API cuando los devuelve [`/cloudphone/monthly/skus`](./open-api.yaml#operation/listMonthlyCloudPhoneSkus); el período actual es de 30 días.\n- **Efecto**: crea los registros de Cloud Phone. Los SKU de pago por minuto se pueden usar tras el aprovisionamiento; los mensuales se crean inactivos. La creación no cobra: los teléfonos mensuales solo se cobran mediante [`/cloudphone/monthly/activate`](./open-api.yaml#operation/activateMonthlyCloudPhones), y los de pago por minuto empiezan a consumir saldo o cuota al encenderse.\n- **Finalización**: **aceptado, no completado.** La instancia del servicio todavía no está lista, y encenderla demasiado pronto se rechaza. Consulta [`/cloudphone/info`](./open-api.yaml#operation/infoUsingPOST) o [`/cloudphone/page`](./open-api.yaml#operation/pageUsingPOST) hasta que `envStatus` indique que el teléfono está apagado. Para un SKU mensual, completa también [`/cloudphone/monthly/activate`](./open-api.yaml#operation/activateMonthlyCloudPhones) antes de encenderlo.\n- **Reintentos**: no es idempotente ni se serializa. No hay clave de idempotencia. No reintentes a ciegas tras un timeout: consulta primero el estado.\n\nErrores de negocio documentados: `19064`, `20018`, `33338`, `33339`, `33340`, `33341`, `33342`, `33343`, `33344`, `33345`, `33398`, `33399`, `33400`, `33408`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "createUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "Modelo de Cloud Phone\nskuId:10002 model:Android 12\nskuId:10013 model:Android 13\nskuId:10005 model:Android 14\nskuId:10004 model:Android 15\nskuId:10014 model:Android 15A\nskuId:10015 model:Android 16\nConsulta la [tabla de países y zonas horarias](/api-reference/appendix/country-time-zone) para ver las regiones admitidas y la correspondencia de zonas horarias\n"
                  },
                  "quantity": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10,
                    "description": "Número de Cloud Phones que se crean. Rango de valores: [1-10]"
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Comentario del perfil (máximo 1500 caracteres)"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "ID del grupo. Usa `\"0\"` para sin grupo."
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Nombre de un grupo existente, o el nombre de un grupo nuevo que se creará si no hay ninguno que coincida."
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Si se debe hacer coincidir automáticamente la ubicación geográfica. Por defecto: true"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Si se debe hacer coincidir automáticamente el idioma. Por defecto: true"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Si se debe hacer coincidir automáticamente la ubicación (zona horaria, país). Por defecto: true"
                  },
                  "country": {
                    "type": "string",
                    "description": "Código de país (por ejemplo `us`). Consulta la [tabla de países y zonas horarias](/api-reference/appendix/country-time-zone) para ver la lista completa"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Zona horaria, por ejemplo America/New_York"
                  },
                  "language": {
                    "type": "string",
                    "description": "Idioma, por ejemplo en-US"
                  },
                  "altitude": {
                    "type": "number",
                    "description": "Altitud"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Latitud. Ejemplo: 22.309182"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Longitud. Ejemplo: 114.176817"
                  },
                  "speed": {
                    "type": "number",
                    "maximum": 400,
                    "description": "Velocidad de movimiento"
                  },
                  "bearing": {
                    "type": "number",
                    "maximum": 360,
                    "description": "Dirección del movimiento"
                  },
                  "accuracy": {
                    "type": "number",
                    "maximum": 100,
                    "description": "Precisión horizontal"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Número de teléfono personalizado. Requisitos de formato: debe empezar por un signo +, el código de país debe tener de 1 a 3 dígitos (sin incluir 86), la longitud total debe ser de 8 a 14 dígitos y solo puede contener + y números."
                  },
                  "brand": {
                    "type": "string",
                    "description": "Marca del dispositivo. Puedes consultarla mediante la interfaz https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post."
                  },
                  "modelId": {
                    "type": "number",
                    "description": "ID del modelo de dispositivo. Puedes consultarlo mediante la interfaz https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post."
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "ID del proxy"
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Nombres de etiquetas. Los valores vacíos se ignoran."
                  }
                },
                "required": [
                  "skuId",
                  "quantity"
                ]
              },
              "example": {
                "skuId": "1661515884160372",
                "quantity": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Este es el IDS de teléfono en la nube."
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "string"
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "error": {}
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/powerOn": {
      "post": {
        "summary": "Teléfono en la nube para startups",
        "description": "Enciende un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar apagado en ese momento. Se rechaza cuando el SKU está retirado o en mantenimiento, cuando el teléfono está retenido por otro miembro, mientras se está comprobando su proxy, cuando la cuenta tiene deuda o el teléfono está desactivado, cuando ha vencido un periodo mensual, y cuando no hay disponibles ni minutos gratuitos, ni plaza de concurrencia, ni saldo positivo. Algunos modelos exigen además la última versión del cliente de Windows.\n- **Efecto**: marca el teléfono como arrancando, lo reserva para el miembro que llama y reserva una plaza de concurrencia o empieza a consumir tiempo. La respuesta indica cuál de las dos se usó.\n- **Finalización**: **aceptado, no completado.** Consulta `/cloudphone/info` hasta que `envStatus` sea encendido; un fallo aparece allí como `errorCode` y `errorMsg`. Los miembros que tengan configurado un host de callback también reciben un webhook.\n- **Reintentos**: una segunda llamada simultánea se rechaza directamente en lugar de ponerse en cola. Tras un timeout, lee `/cloudphone/info`; no reenvíes la petición.\n\nErrores de negocio documentados: `33300`, `33309`, `33315`, `33316`, `33317`, `33318`, `33321`, `33322`, `33323`, `33324`, `33325`, `33346`, `33347`, `33367`, `33376`, `33407`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "powerOnUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "disableMoneySavingMode": {
                    "type": "boolean",
                    "description": "Desactivar el modo de ahorro de energía, valor predeterminado: falso"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1637226321190925"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto 0: Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/powerOff": {
      "post": {
        "summary": "Apaga el teléfono en la nube",
        "description": "Detiene un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar arrancando o encendido. No se puede detener mientras esté retenido por otro miembro, ni mientras haya en curso un nuevo dispositivo en un clic, un reinicio o un restablecimiento.\n- **Efecto**: detiene la facturación, libera la plaza de concurrencia, liquida el consumo e invalida las credenciales de conexión emitidas para la sesión. Detener un teléfono que todavía estaba arrancando interrumpe el arranque en lugar de apagarlo.\n- **Finalización**: la facturación y el estado local se liquidan de forma sincrónica; el apagado del lado del servicio continúa después, así que confírmalo con `/cloudphone/info`.\n- **Reintentos**: una segunda llamada informa de que el teléfono no está en ejecución. Los lotes se interrumpen en el primer fallo, así que vuelve a leer el estado antes de reintentar.\n\nErrores de negocio documentados: `33300`, `33301`, `33308`, `33331`, `33332`, `33333`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "powerOffUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1596527092376632"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto 0: Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/edit/batch": {
      "post": {
        "summary": "Modificar el perfil del teléfono en la nube",
        "description": "Actualiza la configuración de uno o varios Cloud Phones.\n- **Requisitos previos**: los teléfonos deben pertenecer al equipo. Los valores de región, idioma y coordenadas se validan por servicio, exactamente igual que en la creación. Mover un teléfono a un grupo para el que no tienes autorización se rechaza.\n- **Efecto**: sobrescribe los ajustes del teléfono y refresca la configuración de GPS; puede crear asignaciones de etiquetas. No se cobra nada y la concurrencia no se ve afectada.\n- **Finalización**: sincrónica e idempotente para el mismo cuerpo.",
        "operationId": "editBatchUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "ID de los Cloud Phones"
                  },
                  "envName": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1,
                    "description": "Nombre del Cloud Phone (máximo 64 caracteres)"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Número de teléfono personalizado. Requisitos de formato: debe empezar por un signo +, el código de país debe tener de 1 a 3 dígitos (sin incluir 86), la longitud total debe ser de 8 a 14 dígitos y solo puede contener + y números."
                  },
                  "powerOnBillingStrategy": {
                    "type": "integer",
                    "enum": [
                      0,
                      1
                    ],
                    "description": "Método de facturación de Cloud Phones no mensuales (0: por defecto, 1: solo paquete paralelo)"
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "ID del proxy"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "ID del grupo de entornos"
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Nombre de un grupo existente, o el nombre de un grupo nuevo que se creará si no hay ninguno que coincida."
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Nombres de etiquetas de reemplazo. Los valores vacíos se ignoran."
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Comentario del entorno (máximo 1500 caracteres, admite saltos de línea)"
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Geolocalización automática"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Idioma automático"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Ubicación automática (zona horaria y país)"
                  },
                  "country": {
                    "type": "string",
                    "description": "País"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Zona horaria"
                  },
                  "language": {
                    "type": "string",
                    "description": "Idioma"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Latitud"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Longitud"
                  },
                  "enableRoot": {
                    "type": "boolean",
                    "description": "Activar ROOT global"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": [
                  "1637238770951311"
                ],
                "proxyId": "0",
                "automaticGeo": false,
                "automaticLanguage": false,
                "automaticLocation": false,
                "country": "bo",
                "timezone": "America/La_Paz",
                "language": "de-CH",
                "latitude": 0,
                "longitude": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto: 0, Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/setProxy": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Configurar proxy del teléfono en la nube",
        "description": "Vincula un proxy a uno o varios Cloud Phones.\n- **Requisitos previos**: indica al menos uno de `ids` o `uniqueIds`. Los teléfonos deben pertenecer a tu equipo; **no** hace falta que estén encendidos. Si indicas un `proxyId`, debe existir; de lo contrario la llamada se rechaza.\n- **Efecto**: cuando `proxyId` se omite o es `0`, se reutiliza un proxy existente con datos de conexión idénticos y **se crea un registro de proxy nuevo en tu equipo si no hay ninguna coincidencia**. El estado de comprobación del proxy se restablece y se recuerda el proxy anterior.\n- **Finalización**: sincrónica. **Los teléfonos encendidos reciben el nuevo proxy de inmediato: no hace falta reiniciarlos**; los apagados lo aplican en el siguiente arranque.\n- **Reintentos**: volver a vincular un `proxyId` existente es idempotente, pero repetir una llamada que lleve datos de conexión en bruto puede crear otro registro de proxy cada vez que falle la deduplicación.\n\nErrores de negocio documentados: `33300`, `33303`, `33320`, `14023`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "setProxy",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneSetProxyApiDto"
              },
              "example": {
                "ids": [
                  "1558968155668507"
                ],
                "uniqueIds": [
                  1001
                ],
                "proxy": {
                  "proxyIp": "192.168.1.100",
                  "proxyPort": 8080,
                  "proxyProvider": 2
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es siempre null en esta operación; el resultado lo transmite `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = correcto, >0 = error"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/delete/batch": {
      "post": {
        "summary": "Eliminar teléfono en la nube",
        "description": "Libera uno o varios Cloud Phones.\n- **Requisitos previos**: los teléfonos no pueden estar en proceso de transferencia y el equipo no puede tener pedidos pendientes de pago por ellos. El teléfono no tiene que estar apagado.\n- **Efecto**: la instancia del servicio se libera de inmediato. Un teléfono que nunca se activó se elimina por completo; uno activado se conserva como registro desactivado, por lo que sigue apareciendo en los listados con estado desactivado.\n- **Finalización**: sincrónica.\n- **Reintentos**: los teléfonos se procesan uno a uno y la llamada se interrumpe en el primer fallo, así que es posible que el lote se aplique parcialmente. Vuelve a leer `/cloudphone/page` antes de reintentar y reintenta solo los teléfonos que sigan activos.",
        "operationId": "deleteUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "ids"
                ]
              },
              "example": {
                "ids": [
                  "1595755686723985"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto 0: Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/newMachine": {
      "post": {
        "summary": "Nuevo teléfono en la nube con un solo clic",
        "description": "Sustituye la identidad del dispositivo de un Cloud Phone in situ (nuevo dispositivo en un clic).\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Si indicas marca y modelo, deben ser compatibles con el SKU del teléfono. **Esto consume la cuota diaria de creación de Cloud Phone**, la misma que usa `/cloudphone/create`.\n- **Efecto**: envía una marca y un modelo nuevos al dispositivo, borra los registros de apps instaladas de ese teléfono, restablece su número de teléfono e interrumpe cualquier tarea de IA en curso. MoreLogin no define el conjunto exacto de identificadores que regenera el servicio.\n- **Finalización**: **aceptado, no completado.** El teléfono queda en estado de nuevo dispositivo en un clic; consulta `/cloudphone/info` hasta que salga de ese estado.\n- **Concurrencia**: mientras se ejecuta, se rechazan el encendido, el apagado y todos los comandos que requieren un teléfono en ejecución. Una segunda llamada simultánea se rechaza en lugar de ponerse en cola.\n\nErrores de negocio documentados: `33300`, `33301`, `33326`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "oneNewUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  },
                  "brand": {
                    "type": "string",
                    "description": "Marca"
                  },
                  "modelId": {
                    "type": "integer",
                    "description": "ID del modelo"
                  }
                }
              },
              "example": {
                "id": "1595372958075305"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  },
                  "required": [
                    "code",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/info": {
      "post": {
        "summary": "Detalles del teléfono en la nube",
        "description": "Devuelve el detalle completo de un único Cloud Phone, incluidos los nombres de grupo y de etiquetas.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Uso**: es el endpoint principal de estado para las operaciones asíncronas. `envStatus` distingue entre nuevo, creación fallida, apagado, arrancando, encendido, restableciendo, reiniciando y cambio de dispositivo en un clic en curso; `errorCode` y `errorMsg` indican el motivo cuando una operación asíncrona falló.",
        "operationId": "infoUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1672532391231745"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/queryByAndroidId": {
      "post": {
        "summary": "Obtener detalles del teléfono en la nube por AndroidId",
        "description": "Busca un Cloud Phone por el Android ID que informa el dispositivo.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado. El teléfono no necesita estar encendido.\n- **Devuelve**: la misma estructura de detalle que `/cloudphone/info`.\n- **Casos límite**: un `androidId` vacío devuelve éxito con `data` a null en lugar de un error de validación, y si varios teléfonos comparten un Android ID se devuelve uno de ellos de forma arbitraria.",
        "operationId": "queryByAndroidId",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "androidId": {
                    "type": "string",
                    "description": "androidId del teléfono en la nube",
                    "example": "8f7e6d5c4b3a2f1e"
                  }
                },
                "required": [
                  "androidId"
                ]
              },
              "example": {
                "androidId": "8f7e6d5c4b3a2f1e"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/enableRoot": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Habilitar o deshabilitar ROOT global",
        "description": "Activa o desactiva el interruptor global de ROOT de un Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible con dispositivos compatibles; en otros modelos la llamada tiene éxito pero no surte efecto.\n- **Efecto**: a diferencia de `/cloudphone/app/openRoot`, el ajuste **sí se persiste** en el registro de configuración del teléfono y después se envía al servicio como interruptor de todo el dispositivo.\n- **Finalización**: sincrónica. MoreLogin no reinicia el teléfono; cuándo surte efecto el cambio en el dispositivo depende del comportamiento del servicio.\n- **Reintentos**: idempotente.\n\nErrores de negocio documentados: `33300`, `33301`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "enableRoot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneEnableRootApiDTO"
              },
              "example": {
                "id": "1558968155668507",
                "enableRoot": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es siempre null en esta operación; el resultado lo transmite `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = correcto, >0 = error"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/screenCap": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Captura de pantalla del teléfono en la nube",
        "description": "Captura la pantalla del Cloud Phone y devuelve una URL de descarga.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con dispositivos compatibles; los demás modelos rechazan la llamada.\n- **Efecto**: En algunos modelos el archivo de la captura se elimina del dispositivo después de tomarla.\n- **Finalización**: sincrónica. La respuesta incluye una URL temporal para descargar la imagen.\n- **Advertencia**: En algunos modelos la caducidad informada es una hora fija desde la respuesta y `success` siempre es true; no es la vigencia real de la firma. Descarga la imagen cuanto antes en lugar de guardar la URL.\n- **Reintentos**: no hay más efecto que la propia captura, así que es seguro repetir.",
        "operationId": "screenCap",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del teléfono en la nube",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un objeto con los campos `url`, `status`, `expireAt` y `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = correcto, >0 = error"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "url": {
                          "type": "string",
                          "description": "URL de acceso a la captura de pantalla",
                          "example": "http://oss.morelogin.com/test.png"
                        },
                        "status": {
                          "type": "string",
                          "description": "Status representing immediate completion (\"finish\") or pending status (\"pending\")",
                          "example": "finish"
                        },
                        "expireAt": {
                          "type": "string",
                          "description": "Marca de tiempo de caducidad de la URL en milisegundos (solo para algunos modelos)",
                          "example": "1756024767163"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Se generó correctamente",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se rellena si code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "url": "http://oss.morelogin.com/test.png",
                    "status": "finish",
                    "expireAt": "1756024767163",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/screenCapBase64": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Captura de pantalla del teléfono en la nube (respuesta base64)",
        "description": "Captura la pantalla del Cloud Phone y devuelve la imagen en línea como base64.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. **Compatible solo con dispositivos compatibles**: todos los demás modelos rechazan la llamada.\n- **Finalización**: sincrónica. Si falla, la respuesta lleva un mensaje de error en lugar de datos de imagen, así que comprueba `success` antes de decodificar.\n- **Modelos compatibles**: documentado como disponible solo en imágenes de Android 12 y Android 15.\n- **Uso**: prefiere este endpoint sobre `/cloudphone/screenCap` cuando no quieras depender de una URL alojada por el servicio.",
        "operationId": "screenCapBase64",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del teléfono en la nube",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un objeto con los campos `captureBase64`, `errorMessage` y `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 = éxito, >0 = error"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "captureBase64": {
                          "type": "string",
                          "description": "Imagen codificada en Base64",
                          "example": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA....."
                        },
                        "errorMessage": {
                          "type": "string",
                          "description": "Mensaje de error",
                          "example": "success"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Se generó correctamente",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje; se completa si el código > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "captureBase64": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA.....",
                    "errorMessage": "success",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/brand/models": {
      "post": {
        "operationId": "cloudphoneBrandModelsPost",
        "summary": "Consultar lista de marcas y modelos",
        "description": "Lista las marcas y modelos de dispositivo que admite un SKU de Cloud Phone.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado. No interviene ningún Cloud Phone.\n- **Uso**: elige un `brand` y un `modelId` válidos antes de llamar a `/cloudphone/create` o `/cloudphone/newMachine`; ambos rechazan una combinación que este endpoint no devuelva.\n- **Nota**: un `skuId` desconocido devuelve una lista vacía en lugar de un error.",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "ID del producto del teléfono en la nube"
                  }
                },
                "required": [
                  "skuId"
                ]
              },
              "example": {
                "skuId": "10002"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "timestamp": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "brand": {
                            "type": "string"
                          },
                          "model": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "timestamp": 1,
                  "data": [
                    {
                      "brand": "string",
                      "model": "string"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/updateAdb": {
      "post": {
        "summary": "Actualizar el estado de ADB del teléfono en la nube",
        "description": "Activa o desactiva el acceso ADB en uno o varios Cloud Phones.\n- **Requisitos previos**: solo se tienen en cuenta los teléfonos cuyo SKU admite ADB; si ninguno de los indicados cumple el requisito, la llamada se rechaza. Los teléfonos a los que nunca se les asignó una instancia se omiten.\n- **Efecto**: establece el interruptor de ADB en el servicio y lo persiste para los teléfonos que el servicio aceptó.\n- **Fallo parcial**: si algunos teléfonos tienen éxito y otros no, **la llamada informa igualmente un error**. Interpreta un fallo como «puede que algunos teléfonos se hayan cambiado» y vuelve a leer el estado.\n- **Finalización**: sincrónica. Lee los datos de conexión con `/cloudphone/batchAdbInfo`, que solo devuelve datos de los teléfonos encendidos y compatibles con ADB.\n\nErrores de negocio documentados: `33350`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "updateAdbUsingPOST",
        "tags": [
          "ADB"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enableAdb": {
                    "type": "boolean"
                  },
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "enableAdb",
                  "ids"
                ]
              },
              "example": {
                "enableAdb": true,
                "ids": [
                  "1633612946805630"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de resultado devuelto 0: Normal. Los demás códigos son excepciones."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de solicitud de operación"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/batchAdbInfo": {
      "post": {
        "tags": [
          "ADB"
        ],
        "summary": "Consulta por lotes de información de ADB",
        "description": "Obtiene los datos de conexión ADB de hasta 200 Cloud Phones.\n- **Requisitos previos**: los teléfonos deben pertenecer a tu equipo. **No** hace falta que los tengas reservados. Solo se obtienen datos de los teléfonos que están encendidos y cuyo SKU admite ADB.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Resultados parciales**: los resultados se alinean con los identificadores solicitados y **nunca fallan en conjunto**. Cuando no hay datos disponibles, `remark` explica el motivo: el teléfono no existe, no está encendido, no admite ADB, o la consulta al servicio falló. Lee `remark` antes de interpretar una entrada vacía como un error.\n- **Tipos de dispositivo mixtos**: una misma petición puede abarcar teléfonos de tipos de dispositivo distintos; el servicio los agrupa internamente y combina los resultados.\n- **Nota**: activa ADB antes con `/cloudphone/updateAdb`.",
        "operationId": "batchAdbInfoOpenApi",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiBatchAdbInfoDto"
              },
              "example": {
                "envIds": [
                  "1674380838117474",
                  "1675787900043353"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Correcto",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataListApiBatchAdbInfoResultDto"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": [
                    {
                      "id": "1674380838117474",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "192.168.1.100",
                      "adbPassword": "abc12345",
                      "adbPort": "5555",
                      "command": null,
                      "expireTime": null,
                      "remark": null
                    },
                    {
                      "id": "1675787900043353",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "10.0.0.50",
                      "adbPassword": "xyz78900",
                      "adbPort": "22",
                      "command": "ssh -L 5555:localhost:5555 user@10.0.0.50 -p 22",
                      "expireTime": "2026-05-23 12:00:00",
                      "remark": null
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/exeCommand": {
      "post": {
        "summary": "Ejecutar comando de shell",
        "description": "Ejecuta un comando de shell en un Cloud Phone y devuelve su salida.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo.\n- **Efecto**: depende por completo del comando. MoreLogin no almacena nada y **no aplica ninguna lista blanca de comandos ni límite de longitud**; los privilegios con los que se ejecuta el comando los define el servicio del dispositivo. Activa root global por separado si el comando lo necesita.\n- **Finalización**: sincrónica; `data` es la salida del comando, no un identificador de tarea.\n- **Reintentos**: no hay ningún registro de ejecución que consultar, así que un timeout deja el resultado desconocido. Reintenta solo comandos que sepas que es seguro ejecutar dos veces.\n\nErrores de negocio documentados: `33300`, `33301`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "executeShellCommand",
        "tags": [
          "ADB"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del Cloud Phone"
                  },
                  "command": {
                    "type": "string",
                    "description": "Comando de shell que se ejecutará"
                  }
                },
                "required": [
                  "id",
                  "command"
                ]
              },
              "example": {
                "command": "am start -n com.android.chrome/com.google.android.apps.chrome.Main",
                "id": "1674153897828425"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "data": {
                      "type": "string",
                      "description": "Información de respuesta"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de respuesta: Se devolverá un mensaje de error cuando el código sea mayor que 0."
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Identificador único de la solicitud; indíquelo al contactar con soporte"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "data": "string",
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/rpa/template/market/page": {
      "post": {
        "operationId": "cloudphoneRpaTemplateMarketPagePost",
        "summary": "Obtenga páginas de plantillas de mercado",
        "deprecated": false,
        "description": "Lista las plantillas de RPA del mercado público.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado. Las plantillas son globales, no están limitadas al equipo.\n- **Localización**: los títulos y las descripciones se devuelven en el idioma de la petición.\n- **Uso**: `parameter` es una cadena JSON que describe las variables de la plantilla y es a lo que debe ajustarse `templateParameter` cuando creas una programación. Es null en las plantillas que no declaran variables.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Nombre de la plantilla"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado:1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado: 10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "pageNo": null,
                "pageSize": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene los registros de la página solicitada y es un array vacío cuando no hay coincidencias; `data.total`, `data.current` y `data.pages` describen la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Título de la plantilla de mercado"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Cadena JSON de parámetro de plantilla"
                              },
                              "description": {
                                "type": "string",
                                "description": "Descripción de la plantilla de mercado"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "clasificar"
                              },
                              "author": {
                                "type": "string",
                                "description": "autor"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Hora de la última actualización"
                              }
                            },
                            "required": [
                              "parameter"
                            ]
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Número de página actual"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Páginas totales"
                        },
                        "total": {
                          "type": "string",
                          "description": "Recuento total"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "author": "example-author",
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/template/personal/page": {
      "post": {
        "operationId": "cloudphoneRpaTemplatePersonalPagePost",
        "summary": "Obtén plantillas de páginas personalizadas",
        "deprecated": false,
        "description": "Lista las plantillas de RPA que creó tu equipo.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Contenido**: un almacén distinto del mercado, limitado a tu equipo, con títulos simples en un solo idioma.\n- **Precedencia**: cuando un identificador de plantilla existe en ambos almacenes, la creación de la programación lo resuelve como la plantilla de tu equipo.\n- **Uso**: `parameter` describe las variables de la plantilla, exactamente igual que en las plantillas del mercado.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Nombre de la plantilla"
                  },
                  "desc": {
                    "type": "string",
                    "description": "Descripción de la plantilla"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado:1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado: 10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "desc": "string",
                "pageNo": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene los registros de la página solicitada y es un array vacío cuando no hay coincidencias; `data.total`, `data.current` y `data.pages` describen la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Título de la plantilla de mercado"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Cadena JSON de parámetro de plantilla"
                              },
                              "description": {
                                "type": "string",
                                "description": "Descripción de la plantilla de mercado"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "clasificar"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Hora de la última actualización"
                              }
                            }
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Número de página actual"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Páginas totales"
                        },
                        "total": {
                          "type": "string",
                          "description": "Recuento total"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/page": {
      "post": {
        "operationId": "cloudphoneRpaTaskPagePost",
        "summary": "Obtén una lista de horarios",
        "deprecated": false,
        "description": "Lista las programaciones de RPA del equipo, página a página.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Uso**: el `taskState` de cada programación es la señal de finalización de `/cloudphone/rpa/task/cancel`.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Si la programación está activada"
                  },
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Búsqueda difusa en el nombre de la programación, la descripción y el título de la plantilla"
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Estado de la programación; 0: pendiente de ejecución; 1: en ejecución; 2: ejecución completada 3: cancelada\n"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "por defecto: 1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "por defecto: 10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "taskState": 0,
                "searchKey": "daily login",
                "enabled": true
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene los registros de la página solicitada y es un array vacío cuando no hay coincidencias; `data.total`, `data.current` y `data.pages` describen la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "ID de horario"
                              },
                              "taskName": {
                                "type": "string",
                                "description": "Programar Tarea Nombre"
                              },
                              "createMember": {
                                "type": "string",
                                "description": "Nombre del miembro"
                              },
                              "enabled": {
                                "type": "boolean",
                                "description": "Ya sea habilitado"
                              },
                              "endTime": {
                                "type": "string",
                                "description": "Hora de finalización de la tarea"
                              },
                              "failCount": {
                                "type": "integer",
                                "description": "Número de ejecuciones fallidas"
                              },
                              "handleTime": {
                                "type": "string",
                                "description": "Hora de inicio de la ejecución"
                              },
                              "notes": {
                                "type": "string",
                                "description": "notas del cronograma"
                              },
                              "scheduleConfig": {
                                "type": "string",
                                "description": "Configuración del cronograma de tareas"
                              },
                              "successCount": {
                                "type": "integer",
                                "description": "Número de ejecuciones exitosas"
                              },
                              "taskPreviewTimeTable": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "cloudPhoneId": {
                                      "type": "string",
                                      "description": "ID de teléfono en la nube"
                                    },
                                    "cloudPhoneName": {
                                      "type": "string",
                                      "description": "nombre de teléfono en la nube"
                                    },
                                    "times": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      },
                                      "description": "Lista de horarios de ejecución"
                                    }
                                  }
                                }
                              },
                              "taskState": {
                                "type": "integer",
                                "description": "Estado de la tarea programada. 0: en espera; 1: en ejecución; 2: completada; 3: cancelada."
                              },
                              "templateId": {
                                "type": "string",
                                "description": "ID de plantilla"
                              },
                              "templateTitle": {
                                "type": "string",
                                "description": "Título de la plantilla"
                              }
                            },
                            "required": [
                              "createMember"
                            ]
                          },
                          "description": "Lista de planes"
                        },
                        "current": {
                          "type": "string",
                          "description": "Número de página actual"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Páginas totales"
                        },
                        "total": {
                          "type": "string",
                          "description": "Recuento total"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "createMember": "string",
                        "enabled": true,
                        "endTime": "2026-09-01 12:00:00",
                        "failCount": 1,
                        "handleTime": "2026-09-01 12:00:00",
                        "notes": "string",
                        "scheduleConfig": "string",
                        "successCount": 1,
                        "taskPreviewTimeTable": [
                          {
                            "cloudPhoneId": "1673823102599682",
                            "cloudPhoneName": "example-name",
                            "times": [
                              "2026-09-01 12:00:00"
                            ]
                          }
                        ],
                        "taskState": 1,
                        "templateId": "1673823102599682",
                        "templateTitle": "example-title"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/save": {
      "post": {
        "operationId": "cloudphoneRpaTaskSavePost",
        "summary": "Crear un horario",
        "deprecated": false,
        "description": "Guardar la tarea programada del teléfono en la nube.\n\ntemplateParameter Parameter Specification\n 1. __Parameter Source__\nParameter keys must be extracted from the `parameter` field returned by the following APIs:\n- Get market template pages\n- Get Personal template pages\n2.  __Data Structure__\n- Submit parameters in JSON object format: `{\"key1\": \"value1\", \"key2\": \"value2\"}`\n- Final parameter values must be deserialized according to business logic before use\n3. __Common Type Parameters__\nFor the following parameter types, pass values directly in the corresponding format:\n- string: `{\"name\": \"John\"}`\n- decimal / number: `{\"amount\": 100.50}`\n- boolean: `{\"enabled\": true}`\n4. __Media Type Parameters__\nFor media parameters such as image (pic) or video (video), in addition to basic information, a fixed key `\"__Extra__\"` must be included. Example format:\n```json\n{\n    \"__Extra__\": {\n        \"pic\": {\n            \"name\": \"pic_name\",\n            \"size\": 204800\n        },\n        \"video\": {\n            \"name\": \"video_name\",\n            \"size\": 204800000\n        }\n    },\n    \"pic\": \"https://get.morelogin.com/prod/cloudPhoneTaskVideo/1556061681934880/1c62314c7e2b4d298abe8d5452d7c050/test.png\",\n    \"video\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n5. __Parameter Configuration Example__\nThe following example demonstrates how to configure the `templateParameter` parameter when saving a plan using a market template:\n- __Step 1: Retrieve Template Parameters__\nCall the Market Template API:\n`GET /api/cloudphone/rpa/template/market/page`\nExtract the `parameter` field from the response, for example:\n\n```json\n\"parameter\": \"{\\\"videoDownloadUrl\\\":{\\\"type\\\":\\\"video\\\",\\\"extra\\\":{\\\"name\\\":\\\"Select Video\\\",\\\"type\\\":\\\"video\\\",\\\"required\\\":true,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":1,\\\"sizeLimit\\\":{\\\"value\\\":200,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"mp4\\\",\\\"mov\\\"]}},\\\"videoDescription\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Video Caption\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":1000},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":2}},\\\"coverUrl\\\":{\\\"type\\\":\\\"image\\\",\\\"extra\\\":{\\\"name\\\":\\\"Cover Image\\\",\\\"type\\\":\\\"image\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":3,\\\"sizeLimit\\\":{\\\"value\\\":5,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"jpg\\\",\\\"png\\\",\\\"jpeg\\\"]}},\\\"enableAIGC\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"AI Label\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":4}},\\\"productId\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product ID\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":50},\\\"placeholder\\\":\\\"Product ID only supports digits, with a maximum of 50 characters.\\\",\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":5}},\\\"productTitle\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product Title\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":30},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":6}},\\\"getLeads\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"Get Leads\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":7}},\\\"comment\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Comment\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":200},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":8}}}\"\n```\n\n- __Step 2: Build the Parameter JSON__\nConstruct the JSON object according to the parameter requirements:\n```json\n{\n  \"__Extra__\": {\n    \"videoDownloadUrl\": {\n      \"name\": \"video_name.mp4\",\n      \"size\": 204800000\n    }\n  },\n  \"videoDownloadUrl\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n- __Step 3: Escape the JSON String__\nConvert the JSON object into an escaped string format:\n```json\n\"{\\\"__Extra__\\\": {\\\"videoDownloadUrl\\\": {\\\"name\\\": \\\"video_name.mp4\\\",\\\"size\\\": 204800000}},\\\"videoDownloadUrl\\\": \\\"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\\\"}\"\n```\n- __Step 4: API Call__\nPass the escaped string as the value of the `templateParameter` parameter to the target API.\n",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskName": {
                    "type": "string",
                    "description": "Nombre de tarea"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "ID de plantilla"
                  },
                  "templateType": {
                    "type": "string",
                    "description": "Tipo de plantilla. PERSONAL:personal; MARKET:mercado"
                  },
                  "taskType": {
                    "type": "string",
                    "description": "Tipo de tarea. TEMPORARY o SCHEDULED"
                  },
                  "notes": {
                    "type": "string",
                    "description": "Notas del plan"
                  },
                  "cloudPhoneConfigs": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "ID del teléfono en la nube"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Hora de ejecución de la tarea, zona horaria UTC+0"
                        },
                        "templateParameter": {
                          "type": "string",
                          "description": "Los parámetros de la plantilla se definen en plantillas personales o de mercado. Los parámetros en la plantilla se definen como:{\"Test\":{\"extra\":{\"type\":\"string\",\"required\":true,\"multiline\":{\"enabled\":false},\"name\":\"Test\",\"index\":1},\"type\":\"string\"}} Al solicitar parámetros, el parámetro pasado es:{\"Test\":\"xxxx\"}"
                        }
                      },
                      "required": [
                        "cloudPhoneId",
                        "triggerTime",
                        "templateParameter"
                      ]
                    },
                    "description": "Colección de configuraciones de horarios de teléfonos en la nube"
                  },
                  "scheduleConfig": {
                    "type": "object",
                    "properties": {
                      "endTime": {
                        "type": "string",
                        "description": "fecha-hora"
                      },
                      "scheduleType": {
                        "type": "string",
                        "description": "Tipo de horario. ONCE:una vez; DAILY:diario"
                      }
                    },
                    "required": [
                      "endTime",
                      "scheduleType"
                    ],
                    "description": "Configuración del horario de la tarea"
                  }
                },
                "required": [
                  "cloudPhoneConfigs",
                  "scheduleConfig",
                  "taskName",
                  "taskType",
                  "templateId",
                  "templateType"
                ]
              },
              "example": {
                "cloudPhoneConfigs": [
                  {
                    "cloudPhoneId": "1661515884160372",
                    "triggerTime": "string",
                    "templateParameter": "string"
                  }
                ],
                "scheduleConfig": {
                  "endTime": "string",
                  "scheduleType": "string"
                },
                "taskName": "example-name",
                "taskType": "string",
                "templateId": "1661515884160372",
                "templateType": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor entero.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta, 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de rastreo de solicitud"
                    },
                    "data": {
                      "type": "integer",
                      "description": "ID del horario"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/onceTask/save": {
      "post": {
        "operationId": "cloudphoneRpaOnceTaskSavePost",
        "summary": "Crear un horario único",
        "deprecated": false,
        "description": "Guardar el teléfono en la nube una vez programada la tarea\n\nEspecificación de parámetros de plantilla\n1. Origen de los parámetros\nLas claves de los parámetros deben extraerse del campo `parameter` que devuelven las siguientes API:\n- Obtener páginas de plantillas de mercado\n- Obtener páginas de plantillas personales\n2. Estructura de datos\n- Enviar parámetros en formato de objeto JSON: `{\"clave1\": \"valor1\", \"clave2\": \"valor2\"}`\n- Los valores finales de los parámetros deben deserializarse según la lógica de negocio antes de su uso.\n3. Parámetros de tipo común\nPara los siguientes tipos de parámetros, pasar los valores directamente en el formato correspondiente:\n- Cadena: `{\"nombre\": \"John\"}`\n- Decimal/número: `{\"cantidad\": 100.50}`\n- Booleano: `{\"habilitado\": true}`\n4. Parámetros de tipo de medio\nPara parámetros de medios como imágenes o vídeos, además de la información básica, debe incluirse una clave fija `\"__Extra__\"`. Formato de ejemplo:\n```json\n{\n\"__Extra__\": {\n\"pic\": {\n\"name\": \"pic_name\",\n\"size\": 204800\n\n},\n\"video\": {\n\"name\": \"video_name\",\n\"size\": 204800000\n}\n\n},\n\"pic\": \"https://get.morelogin.com/prod/cloudPhoneTaskVideo/1556061681934880/1c62314c7e2b4d298abe8d5452d7c050/test.png\",\n\"video\": \"morelogin://cloudfile?ids=1,2\"\n}\n```\n5. Ejemplo de configuración de parámetros\nEl siguiente ejemplo muestra cómo configurar el parámetro `templateParameter` al guardar un plan usando una plantilla de mercado:\n- Paso 1: Recuperar parámetros de la plantilla\nLlamar a la API de plantillas de mercado:\n`GET /api/cloudphone/rpa/template/market/page`\nExtraer el campo `parameter` de la respuesta, por ejemplo:\n\n```json\n\"parameter\": \"{\\\"videoDownloadUrl\\\":{\\\"type\\\":\\\"video\\\",\\\"extra\\\":{\\\"name\\\":\\\"Select\" Vídeo\\\",\\\"tipo\\\":\\\"vídeo\\\",\\\"obligatorio\\\":verdadero,\\\"valor_predeterminado\\\":{\\\"habilitado\\\":falso},\\\"índice\\\":1,\\\"límite_tamaño\\\":{\\\"valor\\\":200,\\\"unidad\\\":\\\"MB\\\"},\\\"tipo_formato\\\":[\\\"mp4\\\",\\\"mov\\\"]}},\\\"descripción_vídeo\\\":{\\\"tipo\\\":\\\"cadena\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Vídeo Leyenda\\\",\\\"tipo\\\":\\\"cadena\\\",\\\"obligatorio\\\":false,\\\"carácter\\\":{\\\"habilitado\\\":true,\\\"valor\\\":1000},\\\"multilínea\\\":{\\\"habilitado\\\":true,\\\"valor\\\":3},\\\"valor\\predeterminado\\\":{\\\"habilitado\\\":false},\\\"índice\\\":2}},\\\"url\\de\\portada\\\":{\\\"tipo\\\":\\\"imagen\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Portada\" Imagen\\\",\\\"tipo\\\":\\\"imagen\\\",\\\"obligatorio\\\":false,\\\"valor_predeterminado\\\":{\\\"habilitado\\\":false},\\\"índice\\\":3,\\\"límite_tamaño\\\":{\\\"valor\\\":5,\\\"unidad\\\":\\\"MB\\\"},\\\"tipo_formato\\\":[\\\"jpg\\\",\\\"png\\\",\\\"jpeg\\\"]}},\\\"habilitarAIGC\\\":{\\\"tipo\\\":\\\"booleano\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Etiqueta_AI\\\",\\\"tipo\\\":\\\"booleano\\\",\\\"obligatorio\\\":false,\\\"valor_predeterminado\\\":{\\\"habilitado\\\":false},\\\"índice\\\":4}},\\\"id_producto\\\":{\\\"tipo\\\":\\\"cadena\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Producto ID\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":50},\\\"placeholder\\\":\\\"El ID del producto solo admite dígitos, con un máximo de 50 caracteres.\"\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":5}},\\\"productTitle\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Producto Título\\\",\\\"tipo\\\":\\\"cadena\\\",\\\"obligatorio\\\":falso,\\\"carácterValidado\\\":{\\\"habilitado\\\":verdadero,\\\"valor\\\":30},\\\"valorPredeterminado\\\":{\\\"habilitado\\\":falso},\\\"índice\\\":6}},\\\"obtenerClientes Potenciales\\\":{\\\"tipo\\\":\\\"booleano\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Obtener \"Clientes potenciales\\\",\\\"tipo\\\":\\\"booleano\\\",\\\"obligatorio\\\":falso,\\\"valor_predeterminado\\\":{\\\"habilitado\\\":falso},\\\"índice\\\":7}},\\\"comentario\\\":{\\\"tipo\\\":\\\"cadena\\\",\\\"extra\\\":{\\\"nombre\\\":\\\"Comentario\\\",\\\"tipo\\\":\\\"cadena\\\",\\\"obligatorio\\\":falso,\\\"caracter_validado\\\":{\\\"habilitado\\\":verdadero,\\\"valor\\\":200},\\\"multilínea\\\":{\\\"habilitado\\\":verdadero,\\\"valor\\\":3},\\\"valor_predeterminado\\\":{\\\"habilitado\\\":falso},\\\"índice\\\":8}}}\"\n```\n\n- __Paso 2: Construir el JSON de parámetros__\nConstruir el objeto JSON según los requisitos de los parámetros:\n```json\n{\n\"__Extra__\": {\n\"videoDownloadUrl\": {\n\"name\": \"video_name.mp4\",\n\"size\": 204800000\n}\n\n},\n\"videoDownloadUrl\": \"morelogin://cloudfile?ids=1,2\"\n}\n``` - __Paso 3: Escapar la cadena JSON__\nConvierte el objeto JSON a un formato de cadena escapada:\n```json\n\"{\\\"__Extra__\\\": {\\\"videoDownloadUrl\\\": {\\\"name\\\": \\\"video_name.mp4\\\",\\\"size\\\": 204800000}},\\\"videoDownloadUrl\\\": \"morelogin://cloudfile?ids=1,2\"\nPaso 4: Llamada a la API\nPase la cadena escapada como valor del parámetro `templateParameter` a la API de destino.\n\nErrores de negocio documentados: `33814`, `33818`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cloudPhoneId": {
                    "type": "string",
                    "description": "ID de teléfono en la nube"
                  },
                  "scheduleName": {
                    "type": "string",
                    "description": "Nombre del horario"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "ID de plantilla, plantilla personal o ID de plantilla de mercado"
                  },
                  "templateParameter": {
                    "type": "string",
                    "description": "Los parámetros de la plantilla se definen en plantillas personales o plantillas de mercado. Los parámetros en la plantilla se definen como: {\"Test\":{\"extra\":{\"type\":string\",\"required\":true,\"multiline\":{\"enabled\":false},\"name\":Test\",\"index\":1},\"type\":string\"}} Al solicitar parámetros, el parámetro que se pasa es: {\"Test\":xxxx\"}"
                  },
                  "description": {
                    "type": "string",
                    "description": "Descripción del horario"
                  }
                },
                "required": [
                  "cloudPhoneId",
                  "scheduleName",
                  "templateId"
                ]
              },
              "example": {
                "cloudPhoneId": "16783319661123",
                "scheduleName": "test",
                "templateId": "1678347487160256",
                "templateParameter": "{\"keyword\": \"abc\"}",
                "description": "descripción del horario"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un único valor entero.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "integer",
                      "description": "ID de horarios"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/cancel": {
      "post": {
        "operationId": "cloudphoneRpaTaskCancelPost",
        "summary": "Cancelar horario",
        "deprecated": false,
        "description": "Cancela una programación de RPA y todas sus ejecuciones que no hayan finalizado.\n- **Requisitos previos**: la programación debe existir en el equipo. Una programación finalizada no se puede cancelar; una ya cancelada devuelve éxito sin hacer nada.\n- **Efecto**: la programación se marca como cancelada **de forma sincrónica**, y se encola una petición de cancelación para cada ejecución pendiente, en espera, en curso o en comprobación.\n- **Finalización**: mixta. Lee el estado de la programación en `/cloudphone/rpa/task/page`, pero confirma las ejecuciones individuales mediante `/cloudphone/rpa/subTask/page`: una ejecución ya en curso se detiene de forma asíncrona, no al instante.\n- **Reintentos**: idempotente.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del plan"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es siempre null en esta operación; el resultado lo transmite `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/page": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskPagePost",
        "summary": "Registro de ejecuciones de tareas de consulta de página",
        "deprecated": false,
        "description": "Lista las ejecuciones individuales de RPA, página a página.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Valores de estado**: `taskState` es `0` en espera, `1` en curso, `2` en cola, `3` correcta, `4` fallida, `5` cancelada. En espera y en cola se distinguen según si la ejecución sigue en su hora de activación original.\n- **Advertencia sobre la búsqueda**: la búsqueda por título de plantilla resuelve primero los títulos en el idioma de la petición actual, así que un título que no coincida con ese idioma devuelve una página vacía en lugar de todas las ejecuciones.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de tarea"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Nombre de la tarea",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Estado del plan; 0: esperando ejecución; 1: Ejecutando; 2: Ejecución completada; 3: Cancelar",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de plantilla",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Título de la plantilla",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de teléfono en la nube",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "nombre de teléfono en la nube",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Hora de inicio de la tarea Zona horaria UTC+0",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Hora de finalización de la tarea (zona horaria UTC+0)\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado:1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado: 10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data.dataList` contiene los registros de la página solicitada y es un array vacío cuando no hay coincidencias; `data.total`, `data.current` y `data.pages` describen la paginación.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExecutionDTO"
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Número de página actual"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Páginas totales"
                        },
                        "total": {
                          "type": "string",
                          "description": "Recuento total"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "taskState": 1,
                        "cloudPhoneId": "1673823102599682",
                        "cloudPhoneName": "example-name",
                        "templateName": "example-name",
                        "handleFailCode": "string",
                        "handleFailReason": "string",
                        "handleResult": 1,
                        "handleResultAttachment": "string",
                        "handleTime": "2026-09-01 12:00:00",
                        "endTime": "2026-09-01 12:00:00",
                        "powerOnTime": "2026-09-01 12:00:00",
                        "triggerNextTime": "2026-09-01 12:00:00",
                        "triggerTime": "2026-09-01 12:00:00",
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": "string",
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/detail/{id}": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskDetailIdPost",
        "summary": "Obtener una ejecución de tarea",
        "deprecated": false,
        "description": "Devuelve el detalle de una única ejecución de RPA.\n- **Requisitos previos**: la ejecución debe pertenecer a tu equipo. La llamada falla si la ejecución, su programación o su Cloud Phone ya no existen.\n- **Efecto**: ninguno. Solo lectura. Es seguro reintentar con retroceso acotado.\n- **Valores de estado**: la misma escala que `/cloudphone/rpa/subTask/page`.\n- **Nota**: los datos del proxy se resuelven incluso para proxies que se hayan eliminado desde entonces, así que una ejecución histórica sigue mostrando el que utilizó.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de la tarea de ejecución",
            "required": true,
            "example": 1678919049331331,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de tarea"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Nombre de la tarea",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Estado del plan; 0: esperando ejecución; 1: Ejecutando; 2: Ejecución completada; 3: Cancelar",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de plantilla",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Título de la plantilla",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ID de teléfono en la nube",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "nombre de teléfono en la nube",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Hora de inicio de la tarea Zona horaria UTC+0",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Hora de finalización de la tarea (zona horaria UTC+0)\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado:1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Predeterminado: 10"
                  }
                }
              },
              "example": {
                "taskId": null,
                "taskName": null,
                "taskState": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es un objeto con los campos `id`, `taskName`, `taskState`, `cloudPhoneId`, `cloudPhoneName`, `templateName`, ….",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "ID de registro de ejecución"
                        },
                        "taskName": {
                          "type": "string",
                          "description": "Programar Tarea Nombre"
                        },
                        "taskState": {
                          "type": "integer",
                          "description": "Estado de la programación; 0: esperando ejecución; 1: Ejecutando; 2: Ejecución completada; 3: Cancelar"
                        },
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "ID de teléfono en la nube"
                        },
                        "cloudPhoneName": {
                          "type": "string",
                          "description": "nombre de teléfono en la nube"
                        },
                        "templateName": {
                          "type": "string",
                          "description": "Título de la plantilla"
                        },
                        "handleFailCode": {
                          "type": "string",
                          "description": "Código de error de tarea"
                        },
                        "handleFailReason": {
                          "type": "string",
                          "description": "Motivo del fallo de la tarea"
                        },
                        "handleResult": {
                          "type": "integer",
                          "description": "Resultado de la tarea. 0: fallida; 1: correcta"
                        },
                        "handleResultAttachment": {
                          "type": "string",
                          "description": "Archivo adjunto con el resultado de la ejecución de la tarea"
                        },
                        "handleTime": {
                          "type": "string",
                          "description": "Tiempo de ejecución"
                        },
                        "endTime": {
                          "type": "string",
                          "description": "Hora de finalización de la tarea"
                        },
                        "powerOnTime": {
                          "type": "string",
                          "description": "Tiempo de encendido del teléfono en la nube"
                        },
                        "triggerNextTime": {
                          "type": "string",
                          "description": "Próxima hora de activación programada"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Hora de activación programada"
                        },
                        "createDate": {
                          "type": "string",
                          "description": "Tiempo de creación"
                        },
                        "createMember": {
                          "type": "string",
                          "description": "Creador"
                        },
                        "updateDate": {
                          "type": "string",
                          "description": "Hora de la última actualización"
                        },
                        "updateMember": {
                          "type": "string",
                          "description": "Última actualización"
                        }
                      }
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "id": "1673823102599682",
                    "taskName": "example-name",
                    "taskState": 1,
                    "cloudPhoneId": "1673823102599682",
                    "cloudPhoneName": "example-name",
                    "templateName": "example-name",
                    "handleFailCode": "string",
                    "handleFailReason": "string",
                    "handleResult": 1,
                    "handleResultAttachment": "string",
                    "handleTime": "2026-09-01 12:00:00",
                    "endTime": "2026-09-01 12:00:00",
                    "powerOnTime": "2026-09-01 12:00:00",
                    "triggerNextTime": "2026-09-01 12:00:00",
                    "triggerTime": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMember": "string",
                    "updateDate": "2026-09-01 12:00:00",
                    "updateMember": "2026-09-01 12:00:00"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/cancel/{id}": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskCancelIdPost",
        "summary": "Cancelar ejecución",
        "deprecated": false,
        "description": "Cancela una única ejecución de RPA sin tocar su programación.\n- **Requisitos previos**: el registro de la ejecución debe existir en el equipo. Una ejecución finalizada no se puede cancelar; una ya cancelada devuelve éxito sin hacer nada.\n- **Efecto**: **solo pone en cola una petición de cancelación; esta llamada no escribe ningún estado.** La programación sigue funcionando y las ejecuciones posteriores no se ven afectadas. Usa `/cloudphone/rpa/task/cancel` para detener la programación en sí.\n- **Finalización**: asíncrona. Consulta `/cloudphone/rpa/subTask/page` o el detalle de la ejecución hasta que el estado pase a cancelado. Una ejecución que ya está en curso no se detiene al instante.\n- **Reintentos**: idempotente; una repetición solo vuelve a encolar la petición.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID del plan"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Correcto. `data` es siempre null en esta operación; el resultado lo transmite `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Código de respuesta: 0 indica éxito, >0 indica fallo"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Mensaje de error"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID de seguimiento de la solicitud"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/touch/click": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Toque - Clic",
        "description": "Toca un punto de la pantalla del Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con modelos compatibles; los demás modelos rechazan la llamada.\n- **Coordenadas**: `pos` debe contener exactamente dos valores, `[x, y]`. **No se comprueban contra la resolución de la pantalla**: un punto fuera de pantalla se transmite tal cual al servicio.\n- **Finalización**: sincrónica. `data.status` es `finish` cuando el gesto terminó, o `pending` cuando el servicio lo puso en cola. Algunos modelos siempre informan `finish`. No hay endpoint para consultar un gesto `pending`.\n- **Reintentos**: no hay deduplicación. Dos llamadas son dos toques, así que un reintento a ciegas tras un timeout puede provocar un doble toque.\n- **Nota**: aquí se acepta `duration` pero se ignora; solo la pulsación larga lo lee.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "touchClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operación exitosa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/doubleClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Toque - Doble clic",
        "description": "Toca dos veces un punto de la pantalla del Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con modelos compatibles; los demás modelos rechazan la llamada.\n- **Efecto**: En algunos modelos se emula con cuatro eventos táctiles con intervalos fijos de 50/100/50 ms, así que el ritmo del toque no es configurable. `duration` se ignora.\n- **Finalización**: sincrónica. `data.status` es `finish` o `pending`, igual que en un toque simple.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a hacer un doble toque.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "touchDoubleClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operación exitosa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/longClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Toque - Pulsación larga",
        "description": "Mantén pulsado un punto de la pantalla del Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con modelos compatibles; los demás modelos rechazan la llamada.\n- **Valores**: `duration` es el tiempo de pulsación en milisegundos, con un máximo de 60000. **No hay límite inferior**, así que un valor negativo pasa la validación y se entrega al servicio. En algunos modelos, si se omite `duration`, el valor por defecto es 1000 ms.\n- **Finalización**: sincrónica. `data.status` es `finish` o `pending`.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a pulsar.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "touchLongClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ],
                "duration": 2000
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operación exitosa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/swipe": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Toque - Deslizar",
        "description": "Desliza entre dos puntos de la pantalla del Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con modelos compatibles; los demás modelos rechazan la llamada.\n- **Valores**: `pos1` es el punto inicial y `pos2` el final, cada uno exactamente `[x, y]`. `duration` es la duración del gesto en milisegundos, con un máximo de 60000; En algunos modelos son 300 ms por defecto y la trayectoria se interpola en cinco eventos de movimiento intermedios.\n- **Finalización**: sincrónica. `data.status` es `finish` o `pending`.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a deslizar.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "touchSwipe",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  540,
                  1500
                ],
                "pos2": [
                  540,
                  500
                ],
                "duration": 300
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operación exitosa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/drag": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Toque - Arrastrar",
        "description": "Arrastra entre dos puntos de la pantalla del Cloud Phone.\n- **Requisitos previos**: el teléfono debe estar encendido y no puede estar retenido por otro miembro del equipo. Compatible solo con modelos compatibles; los demás modelos rechazan la llamada.\n- **Nota**: **En algunos modelos esta es la misma implementación que el deslizamiento**: el servicio delega el arrastre directamente en la rutina de deslizamiento, así que ahí no se distinguen. Otros modelos tienen una acción de arrastre propia.\n- **Finalización**: sincrónica. `data.status` es `finish` o `pending`.\n- **Reintentos**: no hay deduplicación; una llamada repetida vuelve a arrastrar.\n\nErrores de negocio documentados: `33300`, `33301`, `33401`. Consulte [Error Codes](../Getting%20Started/error-codes.md) para el significado de cada código. Cualquier operación puede devolver además los códigos comunes.",
        "operationId": "touchDrag",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  200,
                  500
                ],
                "pos2": [
                  800,
                  500
                ],
                "duration": 500
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Operación exitosa",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Authorization": {
        "type": "http",
        "description": "Valor del campo access_token de la respuesta de la interfaz de obtención del token de acceso",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "ResponseDataPageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Código de estado, 0 significa éxito",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mensaje descriptivo",
            "example": "Success"
          },
          "data": {
            "description": "Datos de respuesta",
            "$ref": "#/components/schemas/PageResultCloudPhoneAppDto"
          }
        }
      },
      "PageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "description": "Número total de registros",
            "example": "15"
          },
          "current": {
            "type": "string",
            "description": "Número de página actual",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "description": "Número total de páginas",
            "example": "2"
          },
          "dataList": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CloudPhoneAppDto"
            },
            "description": "Lista de aplicaciones del equipo"
          }
        }
      },
      "CloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del registro",
            "example": "123456"
          },
          "appName": {
            "type": "string",
            "description": "Nombre de la aplicación",
            "example": "Facebook"
          },
          "packageName": {
            "type": "string",
            "description": "Nombre del paquete de Android",
            "example": "com.facebook.katana"
          },
          "versionName": {
            "type": "string",
            "description": "Nombre visible de la versión",
            "example": "450.0.0.1"
          },
          "versionCode": {
            "type": "string",
            "description": "Código de versión",
            "example": "450000000"
          },
          "enabled": {
            "type": "boolean",
            "description": "Si la aplicación está habilitada",
            "example": true
          },
          "desc": {
            "type": "string",
            "description": "Descripción de la aplicación",
            "example": "Social media application"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Si el acceso ROOT está habilitado para la aplicación",
            "example": false
          }
        }
      },
      "ApiAppRootOperateDto": {
        "type": "object",
        "required": [
          "id",
          "packageNames"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del teléfono en la nube",
            "example": "12345678"
          },
          "packageNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Lista de paquetes de aplicaciones a los que se permite acceso ROOT",
            "example": [
              "com.test"
            ]
          }
        }
      },
      "CloudPhoneSetProxyApiDto": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Lista de ID de entornos de teléfonos en la nube",
            "example": [
              "1558968155668507"
            ]
          },
          "uniqueIds": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Lista de números de secuencia mostrados de los entornos de teléfonos en la nube (se usa como correspondencia si no se indican envIds)",
            "example": [
              1001
            ]
          },
          "proxy": {
            "description": "Configuración del proxy",
            "$ref": "#/components/schemas/CloudPhoneProxyDto"
          }
        }
      },
      "CloudPhoneProxyDto": {
        "type": "object",
        "required": [
          "proxyIp",
          "proxyPort",
          "proxyProvider"
        ],
        "properties": {
          "proxyId": {
            "type": "string",
            "description": "ID de configuración de proxy (si el valor es mayor que 0, se reutiliza una configuración de proxy existente; si está vacío o <=0, se usan los parámetros detallados siguientes para crear/actualizar el proxy)",
            "example": "10002"
          },
          "proxyIp": {
            "type": "string",
            "description": "Dirección IP del servidor proxy",
            "example": "192.168.1.100"
          },
          "proxyPort": {
            "type": "integer",
            "description": "Puerto del servidor proxy",
            "minimum": 1,
            "maximum": 65535,
            "example": 8080
          },
          "proxyName": {
            "type": "string",
            "maxLength": 600,
            "description": "Nombre/descripción de la configuración del proxy",
            "example": "test_proxy_01"
          },
          "proxyProvider": {
            "type": "integer",
            "description": "Tipo de proxy 0:http, 1:https, 2:socks5",
            "example": 2
          },
          "username": {
            "type": "string",
            "maxLength": 200,
            "description": "Usuario de autenticación del proxy",
            "example": "admin"
          },
          "password": {
            "type": "string",
            "maxLength": 100,
            "description": "Contraseña de autenticación del proxy",
            "example": "pwd123"
          },
          "refreshUrl": {
            "type": "string",
            "description": "URL de la API para actualizar la IP del proxy dinámico",
            "example": "http://api.proxy.com/refresh"
          },
          "country": {
            "type": "string",
            "description": "Código de país de la ubicación del proxy (por ejemplo, CN, US)",
            "example": "US"
          },
          "state": {
            "type": "string",
            "description": "Estado/Provincia de la ubicación del proxy",
            "example": "California"
          },
          "city": {
            "type": "string",
            "description": "Ciudad de la ubicación del proxy",
            "example": "Los Angeles"
          }
        }
      },
      "CloudPhoneEnableRootApiDTO": {
        "type": "object",
        "required": [
          "id",
          "enableRoot"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del teléfono en la nube",
            "example": "1558968155668507"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Si se habilita el permiso ROOT global a nivel de sistema",
            "example": true
          }
        }
      },
      "CloudPhoneProfile": {
        "type": "object",
        "properties": {
          "abnormalStatus": {
            "type": "integer",
            "description": "Estado anormal: 0-Sin anomalías 1-No activado 2-Fuera de contrato 3-Sobrevendido 4-Desactivado"
          },
          "adbInfo": {
            "$ref": "#/components/schemas/AdbInfo"
          },
          "billingType": {
            "type": "integer",
            "description": "Facturación: 0-Gratis 1-Suscripción flexible 2-Mensual"
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMember": {
            "type": "integer"
          },
          "createMemberName": {
            "type": "string"
          },
          "enableAdb": {
            "type": "boolean"
          },
          "envName": {
            "type": "string",
            "description": "Nombre del teléfono en la nube"
          },
          "envRemark": {
            "type": "string",
            "description": "Comentarios sobre el perfil"
          },
          "envStatus": {
            "type": "integer",
            "description": "Estado del perfil: 0-Nuevo 1-Error al crear 2-Detenido 3-Iniciando 4-Iniciando 5-Reinicio en curso"
          },
          "expireTime": {
            "type": "string",
            "description": "tiempo de expiración"
          },
          "groupId": {
            "type": "string"
          },
          "groupName": {
            "description": "Nombre del grupo. Null cuando el teléfono en la nube no pertenece a ningún grupo",
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "androidId": {
            "type": "string",
            "description": "android id del teléfono en la nube"
          },
          "gaid": {
            "type": "string",
            "description": "gaid del teléfono en la nube"
          },
          "lastConnectDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "type": "string"
          },
          "lastConnectMemberName": {
            "type": "string"
          },
          "lastStartDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastStartMemberId": {
            "type": "string"
          },
          "lastStartMemberName": {
            "type": "string"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInfo"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "Estado del proxy: 0-No detectado 1-Detectando 2-Detección fallida 3-Detección exitosa"
          },
          "supportAdb": {
            "type": "boolean"
          },
          "tagInfos": {
            "description": "Detalles de las etiquetas. Array vacío cuando no hay etiquetas asignadas",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "ID de la etiqueta",
                  "type": "string"
                },
                "tagName": {
                  "description": "Nombre de la etiqueta",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "updateDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "updateMember": {
            "type": "integer"
          }
        }
      },
      "AdbInfo": {
        "type": "object",
        "properties": {
          "adbIp": {
            "type": "string",
            "description": "IP de ADB"
          },
          "adbPassword": {
            "type": "string",
            "description": "contraseña de conexión adb"
          },
          "adbPort": {
            "type": "string",
            "description": "puerto adb"
          },
          "remark": {
            "type": "string",
            "description": "Información sobre observaciones de fallos"
          },
          "success": {
            "type": "integer",
            "description": "Adquisición exitosa 1=Sí 0=No"
          }
        },
        "required": [
          "adbIp",
          "adbPassword",
          "adbPort",
          "remark",
          "success"
        ]
      },
      "ProxyInfo": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string"
          },
          "countryCode": {
            "type": "string"
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "delFlag": {
            "type": "integer",
            "description": "1 - eliminado 2 - no eliminado"
          },
          "expiryTime": {
            "type": "string"
          },
          "exportIp": {
            "type": "string"
          },
          "groupId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "providerCode": {
            "type": "string"
          },
          "proxyAreaCode": {
            "type": "string"
          },
          "proxyCatagoryType": {
            "type": "integer",
            "description": "Tipo de proxy: 0: grupo de sitios 1: plataforma en la nube 2: IP propia 3: VPS 4: máquina virtual"
          },
          "proxyCheckStatus": {
            "type": "integer",
            "description": "Estado de detección: 0: detección pendiente 1: detección exitosa 2: fallo de detección 3: error desconocido"
          },
          "proxyInfo": {
            "type": "string"
          },
          "proxyIp": {
            "type": "string"
          },
          "proxyName": {
            "type": "string"
          },
          "proxyPort": {
            "type": "integer"
          },
          "proxyRegionCode": {
            "type": "string"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "0-Normal 1-Asignación pendiente 2-Actualización 3-Caducado"
          },
          "proxySub": {
            "$ref": "#/components/schemas/ProxySubscription"
          },
          "proxyType": {
            "type": "integer",
            "description": "Tipo de proxy: 0-http 1-https 2-socks5 4-Oxylabs 5-Proxys.io 6-GeoSurf 9-Oxylabsauto 10-Trogan 11-Shadowsocks 12-vmess"
          },
          "proxyTypeCode": {
            "type": "string"
          },
          "regionKey": {
            "type": "string"
          },
          "releaseTime": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Tiempo de liberación: tiempo de eliminación si se elimina, tiempo de expiración si expira."
          },
          "uniqueId": {
            "type": "integer"
          }
        },
        "required": [
          "country",
          "countryCode",
          "createDate",
          "delFlag",
          "expiryTime",
          "exportIp",
          "groupId",
          "id",
          "providerCode",
          "proxyAreaCode",
          "proxyCatagoryType",
          "proxyCheckStatus",
          "proxyInfo",
          "proxyIp",
          "proxyName",
          "proxyPort",
          "proxyRegionCode",
          "proxyStatus",
          "proxySub",
          "proxyType",
          "proxyTypeCode",
          "regionKey",
          "releaseTime",
          "uniqueId"
        ]
      },
      "ProxySubscription": {
        "type": "object",
        "properties": {
          "activeRecordId": {
            "type": "string"
          },
          "businessId": {
            "type": "string"
          },
          "createMember": {
            "type": "integer"
          },
          "endTime": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "nextBillingTime": {
            "type": "string"
          },
          "startTime": {
            "type": "string"
          },
          "subPayMethod": {
            "type": "string"
          },
          "subStatus": {
            "type": "integer",
            "description": "Estado de la suscripción: 0-Pendiente 1-Suscrito 2-Cancelado"
          },
          "subType": {
            "type": "integer",
            "description": "Tipo de suscripción: 1 agente, 2 paquetes"
          },
          "teamId": {
            "type": "string"
          }
        },
        "required": [
          "activeRecordId",
          "businessId",
          "createMember",
          "endTime",
          "id",
          "nextBillingTime",
          "startTime",
          "subPayMethod",
          "subStatus",
          "subType",
          "teamId"
        ]
      },
      "CloudPhoneDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "androidId": {
            "type": "string",
            "description": "android id del teléfono en la nube"
          },
          "gaid": {
            "type": "string",
            "description": "gaid del teléfono en la nube"
          },
          "envName": {
            "type": "string"
          },
          "groupId": {
            "type": "string"
          },
          "groupName": {
            "description": "Nombre del grupo. Null cuando el teléfono en la nube no pertenece a ningún grupo",
            "type": [
              "string",
              "null"
            ]
          },
          "skuId": {
            "type": "string"
          },
          "tagInfos": {
            "description": "Detalles de las etiquetas. Array vacío cuando no hay etiquetas asignadas",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "ID de la etiqueta",
                  "type": "string"
                },
                "tagName": {
                  "description": "Nombre de la etiqueta",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "billingType": {
            "type": "integer"
          },
          "proxyStatus": {
            "type": "integer"
          },
          "settings": {
            "type": "object",
            "properties": {
              "automaticGeo": {
                "type": "boolean"
              },
              "automaticLocation": {
                "type": "boolean"
              },
              "automaticLanguage": {
                "type": "boolean"
              },
              "longitude": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "latitude": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "automaticGeo",
              "automaticLocation",
              "automaticLanguage",
              "longitude",
              "latitude"
            ]
          },
          "device": {
            "type": "object",
            "properties": {
              "server": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "countryName": {
                "type": "string"
              },
              "rom": {
                "type": "integer"
              },
              "wifiBssid": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "bluetoothMac": {
                "type": "string"
              }
            },
            "required": [
              "server",
              "countryName",
              "rom",
              "wifiBssid",
              "bluetoothMac"
            ]
          },
          "proxy": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "proxyName": {
                "type": "string"
              },
              "proxyIp": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "proxyName",
              "proxyIp"
            ]
          },
          "lastStartMemberId": {
            "type": "string"
          },
          "lastStartMemberName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastStartDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "type": "string"
          },
          "lastConnectMemberName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastConnectDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "envStatus": {
            "type": "integer"
          },
          "abnormalStatus": {
            "type": "integer"
          },
          "expireTime": {
            "type": "string"
          },
          "envRemark": {
            "type": "string"
          },
          "createMember": {
            "type": "string"
          },
          "updateMember": {
            "type": "string"
          },
          "updateDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMemberName": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "envName",
          "groupId",
          "skuId",
          "tagInfos",
          "billingType",
          "proxyStatus",
          "settings",
          "device",
          "proxy",
          "lastStartMemberId",
          "lastStartMemberName",
          "lastStartDate",
          "lastConnectMemberId",
          "lastConnectMemberName",
          "lastConnectDate",
          "envStatus",
          "abnormalStatus",
          "expireTime",
          "envRemark",
          "createMember",
          "updateMember",
          "updateDate",
          "createDate",
          "createMemberName"
        ]
      },
      "ApiBatchAdbInfoDto": {
        "type": "object",
        "required": [
          "envIds"
        ],
        "properties": {
          "envIds": {
            "type": "array",
            "description": "Lista de ID de entornos, máximo 200",
            "maxItems": 200,
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "example": [
              "1674380838117474",
              "1675787900043353"
            ]
          }
        }
      },
      "ApiBatchAdbInfoResultDto": {
        "type": "object",
        "description": "Resultado de la consulta por lotes de información ADB",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del entorno"
          },
          "supportAdb": {
            "type": "boolean",
            "description": "Si se admite ADB"
          },
          "enableAdb": {
            "type": "boolean",
            "description": "Habilitar ADB: 0 = deshabilitado, 1 = habilitado"
          },
          "envStatus": {
            "type": "integer",
            "description": "Estado del entorno:\n- 0: nuevo\n- 1: error de creación\n- 2: apagado\n- 3: iniciando\n- 4: encendido\n- 5: restableciendo\n- 6: reiniciando\n- 7: cambio de dispositivo en un clic en curso"
          },
          "adbIp": {
            "type": [
              "string",
              "null"
            ],
            "description": "Dirección IP de la conexión ADB"
          },
          "adbPassword": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contraseña de la conexión ADB"
          },
          "adbPort": {
            "type": [
              "string",
              "null"
            ],
            "description": "Puerto de la conexión ADB"
          },
          "command": {
            "type": [
              "string",
              "null"
            ],
            "description": "Comando de conexión ADB por túnel SSH"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Caducidad de la conexión ADB"
          },
          "remark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Información de comentario. Cuando no se puede obtener la información ADB, se indica el motivo:\n- El entorno no existe\n- El entorno no está encendido, no se puede consultar la información ADB\n- Este entorno no admite ADB\n- No se pudo obtener la información ADB"
          }
        }
      },
      "ResponseDataListApiBatchAdbInfoResultDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Código de respuesta, 0 indica éxito",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mensaje de respuesta",
            "example": "success"
          },
          "data": {
            "type": "array",
            "description": "Lista de información ADB, en el mismo orden que los envIds solicitados",
            "items": {
              "$ref": "#/components/schemas/ApiBatchAdbInfoResultDto"
            }
          }
        }
      },
      "ExecutionDTO": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID de registro de ejecución"
          },
          "taskName": {
            "type": "string",
            "description": "Programar Tarea Nombre"
          },
          "taskState": {
            "type": "integer",
            "description": "Estado de la programación; 0: esperando ejecución; 1: Ejecutando; 2: Ejecución completada; 3: Cancelar"
          },
          "cloudPhoneId": {
            "type": "string",
            "description": "ID de teléfono en la nube"
          },
          "cloudPhoneName": {
            "type": "string",
            "description": "nombre de teléfono en la nube"
          },
          "templateName": {
            "type": "string",
            "description": "Título de la plantilla"
          },
          "handleFailCode": {
            "type": "string",
            "description": "Código de error de tarea"
          },
          "handleFailReason": {
            "type": "string",
            "description": "Motivo del fallo de la tarea"
          },
          "handleResult": {
            "type": "integer",
            "description": "Resultado de la tarea. 0: fallida; 1: correcta"
          },
          "handleResultAttachment": {
            "type": "string",
            "description": "Archivo adjunto con el resultado de la ejecución de la tarea"
          },
          "handleTime": {
            "type": "string",
            "description": "Tiempo de ejecución"
          },
          "endTime": {
            "type": "string",
            "description": "Hora de finalización de la tarea"
          },
          "powerOnTime": {
            "type": "string",
            "description": "Tiempo de encendido del teléfono en la nube"
          },
          "triggerNextTime": {
            "type": "string",
            "description": "Próxima hora de activación programada"
          },
          "triggerTime": {
            "type": "string",
            "description": "Hora de activación programada"
          },
          "createDate": {
            "type": "string",
            "description": "Tiempo de creación"
          },
          "createMember": {
            "type": "string",
            "description": "Creador"
          },
          "updateDate": {
            "type": "string",
            "description": "Hora de la última actualización"
          },
          "updateMember": {
            "type": "string",
            "description": "Última actualización"
          }
        }
      },
      "TouchClickRequest": {
        "type": "object",
        "required": [
          "id",
          "pos"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del teléfono en la nube",
            "example": "1558968155668507"
          },
          "pos": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Coordenadas de toque [x, y]. El sistema de coordenadas utiliza la esquina superior izquierda como origen (0, 0).",
            "example": [
              540,
              960
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Duración de la pulsación en milisegundos (usado para pulsación larga). Si se omite, se usa la duración predeterminada.",
            "example": 2000
          }
        }
      },
      "TouchSwipeRequest": {
        "type": "object",
        "required": [
          "id",
          "pos1",
          "pos2"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del teléfono en la nube",
            "example": "1558968155668507"
          },
          "pos1": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Coordenadas de inicio [x, y]",
            "example": [
              540,
              1500
            ]
          },
          "pos2": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Coordenadas de fin [x, y]",
            "example": [
              540,
              500
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Duración del deslizamiento/arrastre en milisegundos. Un valor mayor resulta en una acción más lenta.",
            "example": 300
          }
        }
      },
      "TouchResultResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Código de estado, 0 significa éxito",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mensaje de respuesta",
            "example": "success"
          },
          "data": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "Estado de ejecución",
                "example": "finish"
              }
            }
          }
        }
      },
      "ResponseEnvelopeBase": {
        "type": "object",
        "required": [
          "code",
          "msg",
          "requestId"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "description": "Business result code; `0` indicates success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message; null when successful",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Request ID for troubleshooting",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        }
      },
      "MonthlyCloudPhoneSkuPrice": {
        "type": "object",
        "required": [
          "price",
          "period",
          "periodUnit"
        ],
        "properties": {
          "price": {
            "type": "integer",
            "minimum": 0,
            "description": "Configured price in US cents"
          },
          "period": {
            "type": "integer",
            "description": "Billing-period count returned by the product service"
          },
          "periodUnit": {
            "type": "string",
            "description": "Localized billing-period unit returned by the product service"
          },
          "priceDesc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Localized display price, when configured"
          }
        }
      },
      "MonthlyCloudPhoneSku": {
        "type": "object",
        "required": [
          "skuId",
          "skuName",
          "prices"
        ],
        "properties": {
          "skuId": {
            "type": "string",
            "description": "Monthly Cloud Phone product ID"
          },
          "skuName": {
            "type": "string",
            "description": "Product name returned in the product-service language"
          },
          "cloudPhoneAndroidVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "Android version, or null when the product has no configured value"
          },
          "cloudPhoneStorage": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Storage capacity in GB, or null when the product has no configured value"
          },
          "prices": {
            "type": "array",
            "minItems": 1,
            "description": "Active monthly price configurations",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneSkuPrice"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateRequest": {
        "type": "object",
        "required": [
          "ids"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "uniqueItems": true,
            "description": "One to ten distinct positive Cloud Phone IDs, encoded as strings to preserve 64-bit precision",
            "items": {
              "type": "string",
              "pattern": "^[1-9][0-9]*$"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivationResult": {
        "type": "object",
        "required": [
          "id",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID"
          },
          "status": {
            "type": "string",
            "enum": [
              "ACTIVATED",
              "FAILED",
              "UNKNOWN"
            ],
            "description": "Activation result"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9]+$",
            "description": "Unix time in milliseconds; present for a successful activation"
          },
          "errorCode": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Business error code for a failed item"
          }
        }
      },
      "MonthlyCloudPhoneActivationData": {
        "type": "object",
        "required": [
          "orderId",
          "orderStatus",
          "results"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "description": "Paid balance-order ID"
          },
          "orderStatus": {
            "type": "integer",
            "enum": [
              1
            ],
            "description": "Order status; 1 means completed"
          },
          "results": {
            "type": "array",
            "description": "One result per requested ID, in request order",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneActivationResult"
            }
          }
        }
      },
      "CloudPhoneLiveStartRequest": {
        "type": "object",
        "required": [
          "phoneId",
          "fileId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          },
          "fileId": {
            "type": "string",
            "description": "ID of an uploaded MP4 live-streaming file (`uploadType=2`)",
            "example": "820000000000000001"
          }
        }
      },
      "CloudPhoneLivePhoneRequest": {
        "type": "object",
        "required": [
          "phoneId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          }
        }
      }
    },
    "responses": {
      "BalanceResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "balance",
                        "remainingDuration",
                        "remainingConcurrency"
                      ],
                      "properties": {
                        "balance": {
                          "type": "integer",
                          "format": "int32",
                          "description": "Available wallet balance in cents"
                        },
                        "remainingDuration": {
                          "type": "string",
                          "pattern": "^[0-9]+$",
                          "description": "Remaining cloud phone duration in minutes, serialized as a numeric string"
                        },
                        "remainingConcurrency": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Remaining team-level cloud phone concurrency"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "balance": 12500,
                "remainingDuration": "120",
                "remainingConcurrency": 3
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "MonthlyCloudPhoneSkusResponse": {
        "description": "Request processed; `data` is an empty array when no monthly product is available",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MonthlyCloudPhoneSku"
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": [
                {
                  "skuId": "10015",
                  "skuName": "Android 14",
                  "cloudPhoneAndroidVersion": "Android 14",
                  "cloudPhoneStorage": 64,
                  "prices": [
                    {
                      "price": 2500,
                      "period": 30,
                      "periodUnit": "days",
                      "priceDesc": "$25/30 days"
                    }
                  ]
                }
              ],
              "requestId": "36d574df5b9e41b5b3c796133ff5a079"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateResponse": {
        "description": "Request processed; inspect `code`, and inspect `data.results` when returned",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MonthlyCloudPhoneActivationData"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "orderId": "1724032801202461",
                "orderStatus": 1,
                "results": [
                  {
                    "id": "1724032706822188",
                    "status": "ACTIVATED",
                    "expireTime": "1791103955843",
                    "errorCode": null
                  }
                ]
              },
              "requestId": "db5e04c2eb804cdfb96b1469c7379bbc"
            }
          }
        }
      },
      "CloudPhoneLiveBooleanResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "description": "Whether the live-streaming operation succeeded"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": true,
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "CloudPhoneLiveStatusResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "liveStatus": {
                          "type": "integer",
                          "enum": [
                            0,
                            1
                          ],
                          "description": "Live status (`0` = stopped, `1` = running)"
                        },
                        "writeFileId": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file ID, when available"
                        },
                        "liveFilePath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file path or URL, when available"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "liveStatus": 1,
                "writeFileId": "820000000000000001",
                "liveFilePath": null
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://api.morelogin.com",
      "description": "MoreLogin Open API endpoint"
    }
  ],
  "security": [
    {
      "Authorization": []
    }
  ]
}